home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / x / volume10 / xt-examples / part04 < prev    next >
Encoding:
Internet Message Format  |  1990-11-04  |  71.5 KB

  1. Path: uunet!timbuk!cs.umn.edu!uc!tut.cis.ohio-state.edu!pacific.mps.ohio-state.edu!zaphod.mps.ohio-state.edu!usc!cs.utexas.edu!sun-barr!newstop!sun!adobe.com!asente
  2. From: asente@adobe.com
  3. Newsgroups: comp.sources.x
  4. Subject: v10i044: Examples from New Xt Book, Part04/05
  5. Message-ID: <144424@sun.Eng.Sun.COM>
  6. Date: 1 Nov 90 05:52:31 GMT
  7. References: <csx-10i041:xt-examples@uunet.UU.NET>
  8. Sender: news@sun.Eng.Sun.COM
  9. Lines: 2264
  10. Approved: argv@sun.com
  11.  
  12. Submitted-by: asente@adobe.com
  13. Posting-number: Volume 10, Issue 44
  14. Archive-name: xt-examples/part04
  15.  
  16. #! /bin/sh
  17. # This is a shell archive, meaning:
  18. # 1. Remove everything above the #! /bin/sh line.
  19. # 2. Save the resulting text in a file.
  20. # 3. Execute the file with /bin/sh (not csh) to create the files:
  21. #    BarDisplay.c
  22. #    Box.c
  23. #    Confirm.c
  24. #    Confirm1.c
  25. #    Graph.c
  26. #    GraphDispl.c
  27. #    Label.c
  28. # This archive created: Wed Oct 24 14:25:38 1990
  29. export PATH; PATH=/bin:$PATH
  30. echo shar: extracting "'BarDisplay.c'" '(7808 characters)'
  31. if test -f 'BarDisplay.c'
  32. then
  33.     echo shar: will not over-write existing file "'BarDisplay.c'"
  34. else
  35. sed 's/^    X//' << \SHAR_EOF > 'BarDisplay.c'
  36.     X/***********************************************************
  37.     XCopyright 1990 by Digital Equipment Corporation, Maynard, Massachusetts.
  38.     X
  39.     X                        All Rights Reserved
  40.     X
  41.     XPermission to use, copy, modify, and distribute these examples for any
  42.     Xpurpose and without fee is hereby granted, provided that the above
  43.     Xcopyright notice appear in all copies and that both that copyright
  44.     Xnotice and this permission notice appear in supporting documentation,
  45.     Xand that the name of Digital not be used in advertising or publicity
  46.     Xpertaining to distribution of the software without specific, written
  47.     Xprior permission.
  48.     X
  49.     XDIGITAL AND THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
  50.     XSOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
  51.     XFITNESS, IN NO EVENT SHALL DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT
  52.     XOR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
  53.     XOF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
  54.     XOR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
  55.     XOR PERFORMANCE OF THIS SOFTWARE.
  56.     X
  57.     X******************************************************************/
  58.     X
  59.     X#include <X11/IntrinsicP.h>    /* Intrinsics header file */
  60.     X#include <X11/StringDefs.h>    /* Resource string definitions */
  61.     X#include "BarDisplaP.h"        /* Bar display object */
  62.     X#include "GraphP.h"        /* Graph widget */
  63.     X
  64.     X#define Offset(field) XtOffsetOf(BarDisplayRec, barDisplay.field)
  65.     X
  66.     Xstatic XtResource resources[] = {
  67.     X    {XtNspace, XtCSpace, XtRDimension, sizeof(Dimension),
  68.     X        Offset(space), XtRImmediate, (XtPointer) 5},
  69.     X    {XtNdefaultGraphWidth, XtCDefaultGraphWidth,
  70.     X    XtRDimension, sizeof(Dimension),
  71.     X        Offset(default_graph_width), XtRImmediate, (XtPointer) 200},
  72.     X    {XtNformat, XtCFormat, XtRString, sizeof(String),
  73.     X    Offset(format), XtRString, "%g"}
  74.     X};
  75.     X#undef Offset
  76.     X
  77.     X/* Forward declarations */
  78.     X
  79.     Xstatic void Initialize(), Redisplay(), ComputeSize();
  80.     Xstatic Boolean SetValues();
  81.     X
  82.     X/* Class record declaration */
  83.     X
  84.     XBarDisplayClassRec barDisplayClassRec = {
  85.     X    /* Object class part */
  86.     X  {
  87.     X    /* superclass         */    (WidgetClass) &graphDisplayClassRec,
  88.     X    /* class_name         */    "BarDisplay",
  89.     X    /* widget_size         */    sizeof(BarDisplayRec),
  90.     X    /* class_initialize      */ NULL,
  91.     X    /* class_part_initialize */    NULL,
  92.     X    /* class_inited          */    FALSE,
  93.     X    /* initialize         */    Initialize,
  94.     X    /* initialize_hook       */    NULL,        
  95.     X    /* obj1             */    NULL,
  96.     X    /* obj2             */    NULL,
  97.     X    /* obj3             */    0,
  98.     X    /* resources         */    resources,
  99.     X    /* num_resources         */    XtNumber(resources),
  100.     X    /* xrm_class         */    NULLQUARK,
  101.     X    /* obj4             */    0,
  102.     X    /* obj5             */    0,
  103.     X    /* obj6             */    0,
  104.     X    /* obj7             */    0,
  105.     X    /* destroy             */    NULL,
  106.     X    /* obj8             */    NULL,
  107.     X    /* obj9             */    NULL,
  108.     X    /* set_values         */    SetValues,
  109.     X    /* set_values_hook       */    NULL,            
  110.     X    /* obj10             */    NULL,  
  111.     X    /* get_values_hook       */    NULL,            
  112.     X    /* obj11             */    NULL,
  113.     X    /* version             */    XtVersion,
  114.     X    /* callback offsets      */ NULL,
  115.     X    /* obj12             */ NULL,
  116.     X    /* obj13             */    NULL,
  117.     X    /* obj14             */ NULL,
  118.     X    /* extension             */ NULL
  119.     X  },
  120.     X    /* GraphDisplay class part    */
  121.     X  {
  122.     X    /* compute_size         */ ComputeSize,
  123.     X    /* expose             */ Redisplay,
  124.     X    /* extension             */ NULL
  125.     X  },
  126.     X    /* BarDisplay class part  */
  127.     X  {
  128.     X    /* extension             */ NULL
  129.     X  }
  130.     X};
  131.     X
  132.     X/* Class record pointer */
  133.     X
  134.     XWidgetClass barDisplayObjectClass = (WidgetClass) &barDisplayClassRec;
  135.     X
  136.     Xstatic void Initialize(request, new, args, num_args)
  137.     X    Widget request, new;
  138.     X    ArgList args;
  139.     X    Cardinal *num_args;
  140.     X{
  141.     X    BarDisplayObject bd = (BarDisplayObject) new;
  142.     X
  143.     X    /* Copy format */
  144.     X    bd->barDisplay.format = XtNewString(bd->barDisplay.format);
  145.     X}
  146.     X
  147.     Xstatic Boolean SetValues(old, request, new, args, num_args)
  148.     X    Widget  old, request, new;
  149.     X    ArgList args;
  150.     X    Cardinal *num_args;
  151.     X{
  152.     X    BarDisplayObject oldbd = (BarDisplayObject) old;
  153.     X    BarDisplayObject newbd = (BarDisplayObject) new;
  154.     X
  155.     X#define NE(field) (oldbd->barDisplay.field != newbd->barDisplay.field)
  156.     X
  157.     X    if (NE(format)) {
  158.     X    newbd->barDisplay.format =
  159.     X        XtNewString(newbd->barDisplay.format);
  160.     X    }
  161.     X
  162.     X    /* If space or format has changed and we're realized, redisplay */
  163.     X
  164.     X    if (NE(space) || NE(format)) {
  165.     X
  166.     X    /* Kludge.  There's no way to tell the Intrinsics to
  167.     X       automatically redisplay, so clear the parent, causing
  168.     X       expose events.  Subclasses will do this too, but multiple
  169.     X       redisplays are avoided since the parent has
  170.     X       XtExposeCompressMultiple. */
  171.     X
  172.     X    if (XtIsRealized(XtParent((Widget) newbd))) {
  173.     X        XClearArea(XtDisplayOfObject(newbd),
  174.     X            XtWindowOfObject(newbd), 0, 0, 0, 0, TRUE);
  175.     X    }
  176.     X    }
  177.     X
  178.     X    return FALSE;
  179.     X}
  180.     X
  181.     Xstatic void ComputeLabelDimensions(bd, label_w, total_w, height)
  182.     X    BarDisplayObject bd;
  183.     X    Dimension *label_w, *total_w, *height;
  184.     X{
  185.     X    register XFontStruct *fs = bd->graphDisplay.font;
  186.     X    register int i;
  187.     X    int width;
  188.     X    GraphWidget parent = (GraphWidget) XtParent((Widget) bd);
  189.     X    char buf[100];
  190.     X
  191.     X    *label_w = *total_w = 0;
  192.     X    if (parent->graph.labels != NULL) {
  193.     X    for (i = 0; i < parent->graph.num_entries; i++) {
  194.     X        width = XTextWidth(fs, parent->graph.labels[i],
  195.     X            strlen(parent->graph.labels[i]));
  196.     X        if (width > *label_w) *label_w = width;
  197.     X    }
  198.     X    }
  199.     X
  200.     X    for (i = 0; i < parent->graph.num_entries; i++) {
  201.     X    (void) sprintf(buf, bd->barDisplay.format,
  202.     X        (float) parent->graph.values[i] / parent->graph.scale);
  203.     X    width = XTextWidth(fs, buf, strlen(buf));
  204.     X    if (width > *total_w) *total_w = width;
  205.     X    }
  206.     X
  207.     X    *total_w += *label_w;
  208.     X    *height = fs->max_bounds.ascent + fs->max_bounds.descent;
  209.     X}
  210.     X
  211.     Xstatic void ComputeSize(w)
  212.     X    GraphWidget w;
  213.     X{
  214.     X    BarDisplayObject bd = (BarDisplayObject) w->composite.children[0];
  215.     X    Dimension label_width, total_width, label_height;
  216.     X
  217.     X    ComputeLabelDimensions(bd, &label_width,
  218.     X        &total_width, &label_height);
  219.     X    
  220.     X    /* If parent has no width, compute one */
  221.     X    if (w->core.width == 0) {
  222.     X    w->core.width = 4*bd->barDisplay.space + total_width +
  223.     X        bd->barDisplay.default_graph_width;
  224.     X    }
  225.     X
  226.     X    /* If parent has no height, compute one */
  227.     X    if (w->core.height == 0) {
  228.     X    w->core.height = w->graph.num_entries *
  229.     X        (bd->barDisplay.space + label_height) +
  230.     X        bd->barDisplay.space;
  231.     X    }
  232.     X}
  233.     X
  234.     Xstatic void Redisplay(w, event, region)
  235.     X    GraphWidget w;
  236.     X    XEvent *event;
  237.     X    Region region;
  238.     X{
  239.     X    BarDisplayObject bd = (BarDisplayObject) w->composite.children[0];
  240.     X    Dimension label_width, total_width, label_height;
  241.     X    Boolean displayBars;
  242.     X    register int i;
  243.     X    int x, y, bar_width;
  244.     X    char buf[100];
  245.     X    register int *values = w->graph.values;
  246.     X    register String *labels = w->graph.labels;
  247.     X
  248.     X    ComputeLabelDimensions(bd, &label_width, &total_width,
  249.     X        &label_height);
  250.     X    
  251.     X    /* See if there's enough room to display bars */
  252.     X
  253.     X    bar_width = w->core.width - total_width - 4*bd->barDisplay.space;
  254.     X    displayBars = (bar_width > (int) bd->barDisplay.space);
  255.     X
  256.     X    y = bd->barDisplay.space;
  257.     X    for (i = 0; i < w->graph.num_entries; i++) {
  258.     X    if (labels != NULL) {
  259.     X        XDrawString(XtDisplay(w), XtWindow(w), bd->graphDisplay.gc,
  260.     X            bd->barDisplay.space,
  261.     X            y + bd->graphDisplay.font->max_bounds.ascent,
  262.     X            labels[i], strlen(labels[i]));
  263.     X        x = label_width + 2*bd->barDisplay.space;
  264.     X    } else x = 0;
  265.     X
  266.     X    if (displayBars) {
  267.     X        XFillRectangle(XtDisplay(w), XtWindow(w),
  268.     X            bd->graphDisplay.gc, x, y, 
  269.     X            bar_width * values[i] / w->graph.max_value,
  270.     X            bd->graphDisplay.font->max_bounds.ascent);
  271.     X        x += bar_width * values[i] / w->graph.max_value +
  272.     X            bd->barDisplay.space;
  273.     X    }
  274.     X
  275.     X    (void) sprintf(buf, bd->barDisplay.format,
  276.     X                (float) values[i] / w->graph.scale);
  277.     X    XDrawString(XtDisplay(w), XtWindow(w), bd->graphDisplay.gc,
  278.     X        x, y + bd->graphDisplay.font->max_bounds.ascent,
  279.     X        buf, strlen(buf));
  280.     X    
  281.     X    y += label_height + bd->barDisplay.space;
  282.     X    }
  283.     X}
  284.     X
  285. SHAR_EOF
  286. if test 7808 -ne "`wc -c < 'BarDisplay.c'`"
  287. then
  288.     echo shar: error transmitting "'BarDisplay.c'" '(should have been 7808 characters)'
  289. fi
  290. fi # end of overwriting check
  291. echo shar: extracting "'Box.c'" '(8572 characters)'
  292. if test -f 'Box.c'
  293. then
  294.     echo shar: will not over-write existing file "'Box.c'"
  295. else
  296. sed 's/^    X//' << \SHAR_EOF > 'Box.c'
  297.     X/***********************************************************
  298.     XCopyright 1990 by Digital Equipment Corporation, Maynard, Massachusetts.
  299.     X
  300.     X                        All Rights Reserved
  301.     X
  302.     XPermission to use, copy, modify, and distribute these examples for any
  303.     Xpurpose and without fee is hereby granted, provided that the above
  304.     Xcopyright notice appear in all copies and that both that copyright
  305.     Xnotice and this permission notice appear in supporting documentation,
  306.     Xand that the name of Digital not be used in advertising or publicity
  307.     Xpertaining to distribution of the software without specific, written
  308.     Xprior permission.
  309.     X
  310.     XDIGITAL AND THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
  311.     XSOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
  312.     XFITNESS, IN NO EVENT SHALL DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT
  313.     XOR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
  314.     XOF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
  315.     XOR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
  316.     XOR PERFORMANCE OF THIS SOFTWARE.
  317.     X
  318.     X******************************************************************/
  319.     X
  320.     X#include <X11/IntrinsicP.h>    /* Intrinsics header file */
  321.     X#include <X11/StringDefs.h>    /* Resource string definitions */
  322.     X#include "BoxP.h"        /* Box private header file */
  323.     X#include "LabelGadge.h"        /* To check LabelGadgets */
  324.     X
  325.     X#define Offset(field) XtOffsetOf(BoxRec, box.field)
  326.     X
  327.     Xstatic XtResource resources[] = {
  328.     X    {XtNmargin, XtCMargin, XtRDimension, sizeof(Dimension),
  329.     X    Offset(margin), XtRImmediate, (XtPointer) 10},
  330.     X};
  331.     X
  332.     X#undef Offset
  333.     X
  334.     X/* Forward declarations */
  335.     X
  336.     Xstatic void ChangeManaged(), Initialize(), InsertChild(),
  337.     X    DeleteChild(), Redisplay();
  338.     Xstatic XtGeometryResult GeometryManager();
  339.     Xstatic Boolean SetValues(), AcceptFocus();
  340.     X
  341.     Xstatic CompositeClassExtensionRec compositeExtension = {
  342.     X    /* next_extension        */ NULL,
  343.     X    /* record_type        */ NULLQUARK,
  344.     X    /* version            */ XtCompositeExtensionVersion,
  345.     X    /* record_size        */ sizeof(CompositeClassExtensionRec),
  346.     X    /* accepts_objects        */ TRUE
  347.     X};
  348.     X
  349.     XBoxClassRec boxClassRec = {
  350.     X    /* Core class part */
  351.     X  {
  352.     X    /* superclass         */    (WidgetClass) &compositeClassRec,
  353.     X    /* class_name         */ "Box",
  354.     X    /* widget_size         */ sizeof(BoxRec),
  355.     X    /* class_initialize      */ NULL,
  356.     X    /* class_part_initialize */ NULL,
  357.     X    /* class_inited          */    FALSE,
  358.     X    /* initialize         */    Initialize,
  359.     X    /* initialize_hook       */    NULL,
  360.     X    /* realize             */    XtInheritRealize,
  361.     X    /* actions             */    NULL,
  362.     X    /* num_actions         */    0,
  363.     X    /* resources         */    resources,
  364.     X    /* num_resources         */    XtNumber(resources),
  365.     X    /* xrm_class         */    NULLQUARK,
  366.     X    /* compress_motion         */    TRUE,
  367.     X    /* compress_exposure     */    XtExposeCompressMultiple,
  368.     X    /* compress_enterleave   */    TRUE,
  369.     X    /* visible_interest         */    FALSE,
  370.     X    /* destroy             */    NULL,
  371.     X    /* resize             */    NULL,
  372.     X    /* expose             */    Redisplay,
  373.     X    /* set_values         */    SetValues,
  374.     X    /* set_values_hook       */    NULL,            
  375.     X    /* set_values_almost     */    XtInheritSetValuesAlmost,  
  376.     X    /* get_values_hook       */    NULL,            
  377.     X    /* accept_focus         */    AcceptFocus,
  378.     X    /* version             */    XtVersion,
  379.     X    /* callback offsets      */    NULL,
  380.     X    /* tm_table              */    NULL,
  381.     X    /* query_geometry         */    XtInheritQueryGeometry,
  382.     X    /* display_accelerator   */    NULL,
  383.     X    /* extension         */    NULL,
  384.     X  },
  385.     X   /* Composite class part */
  386.     X  {
  387.     X    /* geometry_manager         */    GeometryManager,
  388.     X    /* change_managed         */    ChangeManaged,
  389.     X    /* insert_child         */    InsertChild,
  390.     X    /* delete_child         */    DeleteChild,
  391.     X    /* extension         */    (XtPointer) &compositeExtension,
  392.     X  },
  393.     X   /* Box class part */
  394.     X  {
  395.     X    /* extension         */    NULL,
  396.     X  }
  397.     X};
  398.     X
  399.     XWidgetClass boxWidgetClass = (WidgetClass) &boxClassRec;
  400.     X
  401.     Xstatic void DeleteChild(w)
  402.     X    Widget w;
  403.     X{
  404.     X    BoxWidget box = (BoxWidget) XtParent(w);
  405.     X
  406.     X    if (box->box.last_focus == w) box->box.last_focus = NULL;
  407.     X
  408.     X    (*((CompositeWidgetClass)(boxWidgetClass->core_class.superclass))->
  409.     X        composite_class.delete_child) (w);
  410.     X}
  411.     X
  412.     Xstatic void InsertChild(w)
  413.     X    Widget w;
  414.     X{
  415.     X    String params[2];
  416.     X    Cardinal num_params;
  417.     X    Widget parent = XtParent(w);
  418.     X
  419.     X    if (!XtIsWidget(w) && !XtIsSubclass(w, labelGadgetClass)) {
  420.     X    params[0] = XtClass(w)->core_class.class_name;
  421.     X    params[1] = XtClass(parent)->core_class.class_name;
  422.     X    num_params = 2;
  423.     X    XtAppErrorMsg(XtWidgetToApplicationContext(w),
  424.     X        "childError", "class", "WidgetError",
  425.     X        "Children of class %s cannot be added to %n widgets",
  426.     X        params, &num_params);
  427.     X    }
  428.     X
  429.     X    (*((CompositeWidgetClass)(boxWidgetClass->core_class.superclass))->
  430.     X        composite_class.insert_child) (w);
  431.     X}
  432.     X
  433.     Xstatic void Initialize(req, new, args, num_args)
  434.     X    Widget req, new;
  435.     X    ArgList args;
  436.     X    Cardinal *num_args;
  437.     X{
  438.     X    ((BoxWidget) new)->box.last_focus = NULL;
  439.     X}
  440.     X
  441.     Xstatic void CalculateNewSize(box, width, height)
  442.     X    BoxWidget box;
  443.     X    register Dimension *width, *height;
  444.     X{
  445.     X    register Widget child;
  446.     X    register int i;
  447.     X    int right, bottom;
  448.     X
  449.     X    *width = *height = 0;
  450.     X
  451.     X    for (i = 0; i < box->composite.num_children; i++) {
  452.     X        child = box->composite.children[i];
  453.     X    if (!XtIsManaged(child)) continue;
  454.     X    right = child->core.x + child->core.width +
  455.     X        2 * child->core.border_width;
  456.     X    bottom = child->core.y + child->core.height +
  457.     X        2 * child->core.border_width;
  458.     X    if (right > (int) *width) *width = right;
  459.     X    if (bottom > (int) *height) *height = bottom;
  460.     X    }
  461.     X
  462.     X    *width += box->box.margin;
  463.     X    *height += box->box.margin;
  464.     X
  465.     X    if (*width == 0) *width = 1;
  466.     X    if (*height == 0) *height = 1;
  467.     X}
  468.     X
  469.     Xstatic void ChangeManaged(w)
  470.     X    Widget w;
  471.     X{
  472.     X    BoxWidget box = (BoxWidget) w;
  473.     X    XtWidgetGeometry request;
  474.     X    XtGeometryResult result;
  475.     X
  476.     X    CalculateNewSize(box, &request.width, &request.height);
  477.     X
  478.     X    if (request.width != box->core.width ||
  479.     X        request.height != box->core.height) {
  480.     X    request.request_mode = CWWidth | CWHeight;
  481.     X    do {
  482.     X        result = XtMakeGeometryRequest(w, &request, &request);
  483.     X    } while (result == XtGeometryAlmost);
  484.     X    }
  485.     X}
  486.     X
  487.     Xstatic XtGeometryResult GeometryManager(w, desired, allowed)
  488.     X    Widget w;
  489.     X    XtWidgetGeometry *desired, *allowed;
  490.     X{
  491.     X    BoxWidget box = (BoxWidget) XtParent(w);
  492.     X    XtWidgetGeometry request;
  493.     X    XtGeometryResult result;
  494.     X
  495.     X#define Wants(flag) (desired->request_mode & flag)
  496.     X
  497.     X    if (Wants(XtCWQueryOnly)) return XtGeometryYes;
  498.     X
  499.     X    if (Wants(CWWidth)) w->core.width = desired->width;
  500.     X    if (Wants(CWHeight)) w->core.height = desired->height;
  501.     X    if (Wants(CWX)) w->core.x = desired->x;
  502.     X    if (Wants(CWY)) w->core.y = desired->y;
  503.     X    if (Wants(CWBorderWidth)) {
  504.     X    w->core.border_width = desired->border_width;
  505.     X    }
  506.     X
  507.     X    CalculateNewSize(box, &request.width, &request.height);
  508.     X    
  509.     X    if (request.width != box->core.width || 
  510.     X        request.height != box->core.height) {
  511.     X    request.request_mode = CWWidth | CWHeight;
  512.     X    do {
  513.     X        result = XtMakeGeometryRequest((Widget) box,
  514.     X            &request, &request);
  515.     X    } while (result == XtGeometryAlmost);
  516.     X    } 
  517.     X
  518.     X    return XtGeometryYes;
  519.     X
  520.     X#undef Wants
  521.     X}
  522.     X
  523.     Xstatic Boolean SetValues(old, req, new, args, num_args)
  524.     X    Widget old, req, new;
  525.     X    ArgList args;
  526.     X    Cardinal *num_args;
  527.     X{
  528.     X    register BoxWidget oldbox = (BoxWidget) old;
  529.     X    register BoxWidget newbox = (BoxWidget) new;
  530.     X
  531.     X    if (newbox->box.margin != oldbox->box.margin ||
  532.     X        newbox->core.width == 0 || newbox->core.height == 0) {
  533.     X    CalculateNewSize(newbox, &newbox->core.width,
  534.     X        &newbox->core.height);
  535.     X    }
  536.     X
  537.     X    return FALSE;
  538.     X}
  539.     X
  540.     Xstatic Boolean AcceptFocus(w, time)
  541.     X    Widget w;
  542.     X    Time *time;
  543.     X{
  544.     X    BoxWidget box = (BoxWidget) w;
  545.     X    register int i;
  546.     X
  547.     X    if (box->box.last_focus != NULL && 
  548.     X        XtIsManaged(box->box.last_focus)) {
  549.     X    if (XtCallAcceptFocus(box->box.last_focus, time)) {
  550.     X        return TRUE;
  551.     X    }
  552.     X    }
  553.     X
  554.     X    for (i = 0; i < box->composite.num_children; i++) {
  555.     X    if (!XtIsManaged(box->composite.children[i])) continue;
  556.     X    if (XtCallAcceptFocus(box->composite.children[i], time)) {
  557.     X        box->box.last_focus = box->composite.children[i];
  558.     X        return TRUE;
  559.     X    }
  560.     X    }
  561.     X
  562.     X    box->box.last_focus = NULL;
  563.     X    return FALSE;
  564.     X}
  565.     Xstatic void Redisplay(w, event, region)
  566.     X    Widget w;
  567.     X    XEvent *event;
  568.     X    Region region;
  569.     X{
  570.     X    CompositeWidget comp = (CompositeWidget) w;
  571.     X    int i;
  572.     X    Widget c;        /* child */
  573.     X
  574.     X    for (i = 0; i < comp->composite.num_children; i++) {
  575.     X    c = comp->composite.children[i];
  576.     X    if (XtIsManaged(c) && XtIsSubclass(c, labelGadgetClass) &&
  577.     X        XRectInRegion(region, c->core.x, c->core.y,
  578.     X            c->core.width + 2*c->core.border_width,
  579.     X            c->core.height + 2*c->core.border_width)
  580.     X            != RectangleOut) {
  581.     X        (*(XtClass(c)->core_class.expose))(c, event, region);
  582.     X        }
  583.     X    }
  584.     X}
  585. SHAR_EOF
  586. if test 8572 -ne "`wc -c < 'Box.c'`"
  587. then
  588.     echo shar: error transmitting "'Box.c'" '(should have been 8572 characters)'
  589. fi
  590. fi # end of overwriting check
  591. echo shar: extracting "'Confirm.c'" '(8763 characters)'
  592. if test -f 'Confirm.c'
  593. then
  594.     echo shar: will not over-write existing file "'Confirm.c'"
  595. else
  596. sed 's/^    X//' << \SHAR_EOF > 'Confirm.c'
  597.     X/***********************************************************
  598.     XCopyright 1990 by Digital Equipment Corporation, Maynard, Massachusetts.
  599.     X
  600.     X                        All Rights Reserved
  601.     X
  602.     XPermission to use, copy, modify, and distribute these examples for any
  603.     Xpurpose and without fee is hereby granted, provided that the above
  604.     Xcopyright notice appear in all copies and that both that copyright
  605.     Xnotice and this permission notice appear in supporting documentation,
  606.     Xand that the name of Digital not be used in advertising or publicity
  607.     Xpertaining to distribution of the software without specific, written
  608.     Xprior permission.
  609.     X
  610.     XDIGITAL AND THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
  611.     XSOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
  612.     XFITNESS, IN NO EVENT SHALL DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT
  613.     XOR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
  614.     XOF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
  615.     XOR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
  616.     XOR PERFORMANCE OF THIS SOFTWARE.
  617.     X
  618.     X******************************************************************/
  619.     X
  620.     X#include <X11/IntrinsicP.h>    /* Intrinsics header file */
  621.     X#include <X11/StringDefs.h>    /* Resource string definitions */
  622.     X#include "ConfirmP.h"        /* Confirm private header file */
  623.     X#include "Label.h"        /* Label public header file */
  624.     X#include "Pushbutton.h"        /* Pushbutton public header file */
  625.     X
  626.     X#define Offset(field) XtOffsetOf(ConfirmRec, confirm.field)
  627.     X
  628.     Xstatic XtResource resources[] = {
  629.     X    {XtNlabel, XtCLabel, XtRString, sizeof(String),
  630.     X    Offset(label), XtRString, "Click to confirm"},
  631.     X    {XtNbuttonLabel, XtCButtonLabel, XtRString, sizeof(String),
  632.     X    Offset(button_label), XtRString, "OK"},
  633.     X    {XtNcallback, XtCCallback, XtRCallback, sizeof(XtCallbackList),
  634.     X    Offset(callback), XtRCallback, (XtPointer) NULL},
  635.     X};
  636.     X
  637.     X#undef Offset
  638.     X
  639.     X#define LabelChild(w) (((CompositeWidget) w)->composite.children[0])
  640.     X#define ButtonChild(w) (((CompositeWidget) w)->composite.children[1])
  641.     X
  642.     X/* Forward declarations */
  643.     X
  644.     Xstatic void InsertChild(), Initialize(), PositionChildren(),
  645.     X    GetValuesHook();
  646.     Xstatic Boolean SetValues();
  647.     Xstatic XtGeometryResult GeometryManager();
  648.     X
  649.     XConfirmClassRec confirmClassRec = {
  650.     X    /* Core class part */
  651.     X  {
  652.     X    /* superclass         */    (WidgetClass) &boxClassRec,
  653.     X    /* class_name         */ "Confirm",
  654.     X    /* widget_size         */ sizeof(ConfirmRec),
  655.     X    /* class_initialize      */ NULL,
  656.     X    /* class_part_initialize */ NULL,
  657.     X    /* class_inited          */    FALSE,
  658.     X    /* initialize         */    Initialize,
  659.     X    /* initialize_hook       */    NULL,
  660.     X    /* realize             */    XtInheritRealize,
  661.     X    /* actions             */    NULL,
  662.     X    /* num_actions         */    0,
  663.     X    /* resources         */    resources,
  664.     X    /* num_resources         */    XtNumber(resources),
  665.     X    /* xrm_class         */    NULLQUARK,
  666.     X    /* compress_motion         */    TRUE,
  667.     X    /* compress_exposure     */    XtExposeCompressMultiple,
  668.     X    /* compress_enterleave   */    TRUE,
  669.     X    /* visible_interest         */    FALSE,
  670.     X    /* destroy             */    NULL,
  671.     X    /* resize             */    PositionChildren,
  672.     X    /* expose             */    NULL,
  673.     X    /* set_values         */    SetValues,
  674.     X    /* set_values_hook       */    NULL,            
  675.     X    /* set_values_almost     */    XtInheritSetValuesAlmost,  
  676.     X    /* get_values_hook       */    GetValuesHook,
  677.     X    /* accept_focus         */    NULL,
  678.     X    /* version             */    XtVersion,
  679.     X    /* callback offsets      */    NULL,
  680.     X    /* tm_table              */    NULL,
  681.     X    /* query_geometry         */    XtInheritQueryGeometry,
  682.     X    /* display_accelerator   */    NULL,
  683.     X    /* extension         */    NULL,
  684.     X  },
  685.     X   /* Composite class part */
  686.     X  {
  687.     X    /* geometry_manager         */    GeometryManager,
  688.     X    /* change_managed         */    XtInheritChangeManaged,
  689.     X    /* insert_child         */    InsertChild,
  690.     X    /* delete_child         */    XtInheritDeleteChild,
  691.     X    /* extension         */    NULL,
  692.     X  },
  693.     X   /* Box class part */
  694.     X  {
  695.     X    /* extension         */    NULL,
  696.     X  },
  697.     X   /* Confirm class part */
  698.     X  {
  699.     X    /* extension         */    NULL,
  700.     X  }
  701.     X};
  702.     X
  703.     XWidgetClass confirmWidgetClass = (WidgetClass) &confirmClassRec;
  704.     X
  705.     Xstatic void InsertChild(w)
  706.     X    Widget w;
  707.     X{
  708.     X    String params[1];
  709.     X    Cardinal num_params;
  710.     X    CompositeWidget parent = (CompositeWidget) XtParent(w);
  711.     X
  712.     X    if (parent->composite.num_children >= 2) {
  713.     X    params[0] = XtClass(parent)->core_class.class_name;
  714.     X    num_params = 1;
  715.     X    XtAppErrorMsg(XtWidgetToApplicationContext(w),
  716.     X        "childError", "number", "WidgetError",
  717.     X        "Applications cannot add children to %s widgets",
  718.     X        params, &num_params);
  719.     X    }
  720.     X
  721.     X    (*((CompositeWidgetClass)(confirmWidgetClass->
  722.     X        core_class.superclass))->composite_class.insert_child) (w);
  723.     X}
  724.     X
  725.     Xstatic void Callback(w, call_data, client_data)
  726.     X    Widget w;
  727.     X    XtPointer call_data, client_data;
  728.     X{
  729.     X    ConfirmWidget confirm = (ConfirmWidget) XtParent(w);
  730.     X
  731.     X    if (XtIsShell(XtParent(confirm))) XtPopdown(XtParent(confirm));
  732.     X    XtCallCallbackList(confirm, confirm->confirm.callback,
  733.     X        (XtPointer) NULL);
  734.     X}
  735.     X
  736.     Xstatic void CalculateSize(cw, width, height)
  737.     X    ConfirmWidget cw;
  738.     X    Dimension *width, *height;
  739.     X{
  740.     X    int label_width = LabelChild(cw)->core.width +
  741.     X        2 * LabelChild(cw)->core.border_width,
  742.     X    button_width = ButtonChild(cw)->core.width + 
  743.     X        2 * ButtonChild(cw)->core.border_width,
  744.     X    max;
  745.     X
  746.     X    max = label_width > button_width ? label_width : button_width;
  747.     X
  748.     X    *width = max + 2 * cw->box.margin;
  749.     X    *height = LabelChild(cw)->core.height +
  750.     X        ButtonChild(cw)->core.height +
  751.     X        2 * (LabelChild(cw)->core.border_width +
  752.     X            ButtonChild(cw)->core.border_width) +
  753.     X        3 * cw->box.margin;
  754.     X}
  755.     X
  756.     Xstatic void PositionChildren(cw)
  757.     X    ConfirmWidget cw;
  758.     X{
  759.     X    int label_width = LabelChild(cw)->core.width +
  760.     X        2 * LabelChild(cw)->core.border_width,
  761.     X    button_width = ButtonChild(cw)->core.width + 
  762.     X        2 * ButtonChild(cw)->core.border_width;
  763.     X
  764.     X    XtMoveWidget(LabelChild(cw), (cw->core.width - label_width) / 2,
  765.     X        cw->box.margin);
  766.     X    XtMoveWidget(ButtonChild(cw), (cw->core.width - button_width) / 2,
  767.     X        2 * cw->box.margin +
  768.     X        2 * LabelChild(cw)->core.border_width +
  769.     X        LabelChild(cw)->core.height);
  770.     X}
  771.     X
  772.     Xstatic void Initialize(req, new, args, num_args)
  773.     X    Widget req, new;
  774.     X    ArgList args;
  775.     X    Cardinal *num_args;
  776.     X{
  777.     X    ConfirmWidget cw = (ConfirmWidget) new;
  778.     X    Arg arg[1];
  779.     X
  780.     X    cw->confirm.label = XtNewString(cw->confirm.label);
  781.     X    XtSetArg(arg[0], XtNlabel, cw->confirm.label);
  782.     X    (void) XtCreateManagedWidget("label", labelWidgetClass,
  783.     X        new, arg, 1);
  784.     X
  785.     X    cw->confirm.button_label = XtNewString(cw->confirm.button_label);
  786.     X    XtSetArg(arg[0], XtNlabel, cw->confirm.button_label);
  787.     X    (void) XtCreateManagedWidget("button", pushbuttonWidgetClass,
  788.     X        new, arg, 1);
  789.     X    XtAddCallback(ButtonChild(cw), XtNcallback, Callback, NULL);
  790.     X
  791.     X    CalculateSize(cw, &cw->core.width, &cw->core.height);
  792.     X    PositionChildren(cw);
  793.     X}
  794.     X
  795.     Xstatic void Destroy(w)
  796.     X    Widget w;
  797.     X{
  798.     X    ConfirmWidget cw = (ConfirmWidget) w;
  799.     X    
  800.     X    XtFree((char *) cw->confirm.label);
  801.     X    XtFree((char *) cw->confirm.button_label);
  802.     X}
  803.     X
  804.     Xstatic Boolean SetValues(old, req, new, args, num_args)
  805.     X    Widget old, req, new;
  806.     X    ArgList args;
  807.     X    Cardinal *num_args;
  808.     X{
  809.     X    register ConfirmWidget oldcw = (ConfirmWidget) old;
  810.     X    register ConfirmWidget newcw = (ConfirmWidget) new;
  811.     X    Arg arg[1];
  812.     X    Boolean resize = FALSE;
  813.     X
  814.     X#define NE(field) (oldcw->field != newcw->field)
  815.     X
  816.     X    if (NE(confirm.label)) {
  817.     X    XtFree((char *) oldcw->confirm.label);
  818.     X    newcw->confirm.label = XtNewString(newcw->confirm.label);
  819.     X    XtSetArg(arg[0], XtNlabel, newcw->confirm.label);
  820.     X    XtSetValues(LabelChild(newcw), arg, 1);
  821.     X    resize = TRUE;
  822.     X    }
  823.     X
  824.     X    if (NE(confirm.button_label)) {
  825.     X    XtFree((char *) oldcw->confirm.button_label);
  826.     X    newcw->confirm.button_label =
  827.     X        XtNewString(newcw->confirm.button_label);
  828.     X    XtSetArg(arg[0], XtNlabel, newcw->confirm.button_label);
  829.     X    XtSetValues(ButtonChild(newcw), arg, 1);
  830.     X    resize = TRUE;
  831.     X    }
  832.     X
  833.     X    if (NE(box.margin) || resize) {
  834.     X    CalculateSize(newcw, &newcw->core.width, &newcw->core.height);
  835.     X    }
  836.     X
  837.     X    return FALSE;
  838.     X#undef NE
  839.     X}
  840.     X
  841.     Xstatic void GetValuesHook(w, args, num_args)
  842.     X    Widget w;
  843.     X    ArgList args;
  844.     X    Cardinal *num_args;
  845.     X{
  846.     X    register int i;
  847.     X
  848.     X    for (i = 0; i < *num_args; i++) {
  849.     X    if (strcmp(args[i].name, XtNlabelWidget) == 0) {
  850.     X        *(Widget *) (args[i].value) = LabelChild(w);
  851.     X    } else if (strcmp(args[i].name, XtNbuttonWidget) == 0) {
  852.     X        *(Widget *) (args[i].value) = ButtonChild(w);
  853.     X    }
  854.     X    }
  855.     X}
  856.     X
  857.     Xstatic XtGeometryResult GeometryManager(w, desired, allowed)
  858.     X    Widget w;
  859.     X    XtWidgetGeometry *desired, *allowed;
  860.     X{
  861.     X#define Wants(flag) (desired->request_mode & flag)
  862.     X
  863.     X    if (Wants(CWWidth)) w->core.width = desired->width;
  864.     X    if (Wants(CWHeight)) w->core.height = desired->height;
  865.     X    if (Wants(CWX)) w->core.x = desired->x;
  866.     X    if (Wants(CWY)) w->core.y = desired->y;
  867.     X    if (Wants(CWBorderWidth)) {
  868.     X    w->core.border_width = desired->border_width;
  869.     X    }
  870.     X
  871.     X    return XtGeometryYes;
  872.     X
  873.     X#undef Wants
  874.     X}
  875. SHAR_EOF
  876. if test 8763 -ne "`wc -c < 'Confirm.c'`"
  877. then
  878.     echo shar: error transmitting "'Confirm.c'" '(should have been 8763 characters)'
  879. fi
  880. fi # end of overwriting check
  881. echo shar: extracting "'Confirm1.c'" '(7852 characters)'
  882. if test -f 'Confirm1.c'
  883. then
  884.     echo shar: will not over-write existing file "'Confirm1.c'"
  885. else
  886. sed 's/^    X//' << \SHAR_EOF > 'Confirm1.c'
  887.     X/***********************************************************
  888.     XCopyright 1990 by Digital Equipment Corporation, Maynard, Massachusetts.
  889.     X
  890.     X                        All Rights Reserved
  891.     X
  892.     XPermission to use, copy, modify, and distribute these examples for any
  893.     Xpurpose and without fee is hereby granted, provided that the above
  894.     Xcopyright notice appear in all copies and that both that copyright
  895.     Xnotice and this permission notice appear in supporting documentation,
  896.     Xand that the name of Digital not be used in advertising or publicity
  897.     Xpertaining to distribution of the software without specific, written
  898.     Xprior permission.
  899.     X
  900.     XDIGITAL AND THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
  901.     XSOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
  902.     XFITNESS, IN NO EVENT SHALL DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT
  903.     XOR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
  904.     XOF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
  905.     XOR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
  906.     XOR PERFORMANCE OF THIS SOFTWARE.
  907.     X
  908.     X******************************************************************/
  909.     X
  910.     X#include <X11/IntrinsicP.h>    /* Intrinsics header file */
  911.     X#include <X11/StringDefs.h>    /* Resource string definitions */
  912.     X#include "Confirm1P.h"        /* Confirm private header file */
  913.     X#include "Label.h"        /* Label public header file */
  914.     X#include "Pushbutton.h"        /* Pushbutton public header file */
  915.     X
  916.     X#define Offset(field) XtOffsetOf(ConfirmRec, confirm.field)
  917.     X
  918.     Xstatic XtResource resources[] = {
  919.     X    {XtNmargin, XtCMargin, XtRDimension, sizeof(Dimension),
  920.     X    Offset(margin), XtRImmediate, (XtPointer) 10},
  921.     X    {XtNlabel, XtCLabel, XtRString, sizeof(String),
  922.     X    Offset(label), XtRString, "Click to confirm"},
  923.     X    {XtNbuttonLabel, XtCButtonLabel, XtRString, sizeof(String),
  924.     X    Offset(button_label), XtRString, "OK"},
  925.     X    {XtNcallback, XtCCallback, XtRCallback, sizeof(XtPointer),
  926.     X    Offset(callback), XtRCallback, (XtPointer) NULL},
  927.     X    {XtNlabelWidget, XtCReadOnly, XtRWidget, sizeof(Widget),
  928.     X        Offset(label_widget), XtRImmediate, (XtPointer) NULL},
  929.     X    {XtNbuttonWidget, XtCReadOnly, XtRWidget, sizeof(Widget),
  930.     X        Offset(button_widget), XtRImmediate, (XtPointer) NULL}
  931.     X};
  932.     X
  933.     X#undef Offset
  934.     X
  935.     X#define LabelChild(w) (((ConfirmWidget) w)->confirm.label_widget)
  936.     X#define ButtonChild(w) (((ConfirmWidget) w)->confirm.button_widget)
  937.     X
  938.     X/* Forward declarations */
  939.     X
  940.     Xstatic void Initialize(), PositionChildren(), Realize(), Destroy();
  941.     Xstatic Boolean SetValues();
  942.     X
  943.     XConfirmClassRec confirmClassRec = {
  944.     X    /* Core class part */
  945.     X  {
  946.     X    /* superclass         */    (WidgetClass) &widgetClassRec,
  947.     X    /* class_name         */ "Confirm",
  948.     X    /* widget_size         */ sizeof(ConfirmRec),
  949.     X    /* class_initialize      */ NULL,
  950.     X    /* class_part_initialize */ NULL,
  951.     X    /* class_inited          */    FALSE,
  952.     X    /* initialize         */    Initialize,
  953.     X    /* initialize_hook       */    NULL,
  954.     X    /* realize             */    Realize,
  955.     X    /* actions             */    NULL,
  956.     X    /* num_actions         */    0,
  957.     X    /* resources         */    resources,
  958.     X    /* num_resources         */    XtNumber(resources),
  959.     X    /* xrm_class         */    NULLQUARK,
  960.     X    /* compress_motion         */    TRUE,
  961.     X    /* compress_exposure     */    XtExposeCompressMultiple,
  962.     X    /* compress_enterleave   */    TRUE,
  963.     X    /* visible_interest         */    FALSE,
  964.     X    /* destroy             */    Destroy,
  965.     X    /* resize             */    PositionChildren,
  966.     X    /* expose             */    NULL,
  967.     X    /* set_values         */    SetValues,
  968.     X    /* set_values_hook       */    NULL,            
  969.     X    /* set_values_almost     */    XtInheritSetValuesAlmost,  
  970.     X    /* get_values_hook       */    NULL,
  971.     X    /* accept_focus         */    NULL,
  972.     X    /* version             */    XtVersion,
  973.     X    /* callback offsets      */    NULL,
  974.     X    /* tm_table              */    NULL,
  975.     X    /* query_geometry         */    XtInheritQueryGeometry,
  976.     X    /* display_accelerator   */    NULL,
  977.     X    /* extension         */    NULL,
  978.     X  },
  979.     X   /* Confirm class part */
  980.     X  {
  981.     X    /* extension         */    NULL,
  982.     X  }
  983.     X};
  984.     X
  985.     XWidgetClass confirmWidgetClass = (WidgetClass) &confirmClassRec;
  986.     X
  987.     Xstatic void Callback(w, call_data, client_data)
  988.     X    Widget w;
  989.     X    XtPointer call_data, client_data;
  990.     X{
  991.     X    ConfirmWidget confirm = (ConfirmWidget) XtParent(w);
  992.     X
  993.     X    if (XtIsShell(XtParent(confirm))) XtPopdown(XtParent(confirm));
  994.     X    XtCallCallbackList(confirm, confirm->confirm.callback,
  995.     X        (XtPointer) NULL);
  996.     X}
  997.     X
  998.     Xstatic void CalculateSize(cw, width, height)
  999.     X    ConfirmWidget cw;
  1000.     X    Dimension *width, *height;
  1001.     X{
  1002.     X    int label_width = LabelChild(cw)->core.width +
  1003.     X        2 * LabelChild(cw)->core.border_width,
  1004.     X    button_width = ButtonChild(cw)->core.width + 
  1005.     X        2 * ButtonChild(cw)->core.border_width,
  1006.     X    max;
  1007.     X
  1008.     X    max = label_width > button_width ? label_width : button_width;
  1009.     X
  1010.     X    *width = max + 2 * cw->confirm.margin;
  1011.     X    *height = LabelChild(cw)->core.height +
  1012.     X        ButtonChild(cw)->core.height +
  1013.     X        2 * (LabelChild(cw)->core.border_width +
  1014.     X            ButtonChild(cw)->core.border_width) +
  1015.     X        3 * cw->confirm.margin;
  1016.     X}
  1017.     X
  1018.     Xstatic void PositionChildren(cw)
  1019.     X    ConfirmWidget cw;
  1020.     X{
  1021.     X    int label_width = LabelChild(cw)->core.width +
  1022.     X        2 * LabelChild(cw)->core.border_width,
  1023.     X    button_width = ButtonChild(cw)->core.width + 
  1024.     X        2 * ButtonChild(cw)->core.border_width;
  1025.     X
  1026.     X    XtMoveWidget(LabelChild(cw), (cw->core.width - label_width) / 2,
  1027.     X        cw->confirm.margin);
  1028.     X    XtMoveWidget(ButtonChild(cw), (cw->core.width - button_width) / 2,
  1029.     X        2 * cw->confirm.margin +
  1030.     X        2 * LabelChild(cw)->core.border_width +
  1031.     X        LabelChild(cw)->core.height);
  1032.     X}
  1033.     X
  1034.     Xstatic void Initialize(req, new, args, num_args)
  1035.     X    Widget req, new;
  1036.     X    ArgList args;
  1037.     X    Cardinal *num_args;
  1038.     X{
  1039.     X    ConfirmWidget cw = (ConfirmWidget) new;
  1040.     X    Arg arg[1];
  1041.     X
  1042.     X    cw->confirm.label = XtNewString(cw->confirm.label);
  1043.     X    XtSetArg(arg[0], XtNlabel, cw->confirm.label);
  1044.     X    LabelChild(cw) = XtCreateWidget("label", labelWidgetClass,
  1045.     X        new, arg, 1);
  1046.     X
  1047.     X    cw->confirm.button_label = XtNewString(cw->confirm.button_label);
  1048.     X    XtSetArg(arg[0], XtNlabel, cw->confirm.button_label);
  1049.     X    ButtonChild(cw) = XtCreateWidget("button", pushbuttonWidgetClass,
  1050.     X        new, arg, 1);
  1051.     X    XtAddCallback(ButtonChild(cw), XtNcallback, Callback, NULL);
  1052.     X
  1053.     X    CalculateSize(cw, &cw->core.width, &cw->core.height);
  1054.     X    PositionChildren(cw);
  1055.     X}
  1056.     X
  1057.     Xstatic void Realize(w, valueMask, attributes)
  1058.     X    Widget w;
  1059.     X    XtValueMask *valueMask;
  1060.     X    XSetWindowAttributes *attributes;
  1061.     X{
  1062.     X    (*confirmWidgetClass->core_class.superclass->core_class.realize)
  1063.     X        (w, valueMask, attributes);
  1064.     X    XtRealizeWidget(LabelChild(w));
  1065.     X    XtRealizeWidget(ButtonChild(w));
  1066.     X    XMapSubwindows(XtDisplay(w), XtWindow(w));
  1067.     X}
  1068.     X
  1069.     Xstatic void Destroy(w)
  1070.     X    Widget w;
  1071.     X{
  1072.     X    ConfirmWidget cw = (ConfirmWidget) w;
  1073.     X    
  1074.     X    XtFree((char *) cw->confirm.label);
  1075.     X    XtFree((char *) cw->confirm.button_label);
  1076.     X
  1077.     X    XtDestroyWidget(LabelChild(w));
  1078.     X    XtDestroyWidget(ButtonChild(w));
  1079.     X}
  1080.     X
  1081.     Xstatic Boolean SetValues(old, req, new, args, num_args)
  1082.     X    Widget old, req, new;
  1083.     X    ArgList args;
  1084.     X    Cardinal *num_args;
  1085.     X{
  1086.     X    register ConfirmWidget oldcw = (ConfirmWidget) old;
  1087.     X    register ConfirmWidget newcw = (ConfirmWidget) new;
  1088.     X    Arg arg[1];
  1089.     X    Boolean resize = FALSE;
  1090.     X
  1091.     X#define NE(field) (oldcw->field != newcw->field)
  1092.     X
  1093.     X    /* We don't let these change */
  1094.     X    LabelChild(newcw) = LabelChild(oldcw);
  1095.     X    ButtonChild(newcw) = ButtonChild(oldcw);
  1096.     X
  1097.     X    if (NE(confirm.label)) {
  1098.     X    XtFree((char *) oldcw->confirm.label);
  1099.     X    newcw->confirm.label = XtNewString(newcw->confirm.label);
  1100.     X    XtSetArg(arg[0], XtNlabel, newcw->confirm.label);
  1101.     X    XtSetValues(LabelChild(newcw), arg, 1);
  1102.     X    resize = TRUE;
  1103.     X    }
  1104.     X
  1105.     X    if (NE(confirm.button_label)) {
  1106.     X    XtFree((char *) oldcw->confirm.button_label);
  1107.     X    newcw->confirm.button_label =
  1108.     X        XtNewString(newcw->confirm.button_label);
  1109.     X    XtSetArg(arg[0], XtNlabel, newcw->confirm.button_label);
  1110.     X    XtSetValues(ButtonChild(newcw), arg, 1);
  1111.     X    resize = TRUE;
  1112.     X    }
  1113.     X
  1114.     X    if (NE(confirm.margin) || resize) {
  1115.     X    CalculateSize(newcw, &newcw->core.width, &newcw->core.height);
  1116.     X    }
  1117.     X
  1118.     X    return FALSE;
  1119.     X#undef NE
  1120.     X}
  1121. SHAR_EOF
  1122. if test 7852 -ne "`wc -c < 'Confirm1.c'`"
  1123. then
  1124.     echo shar: error transmitting "'Confirm1.c'" '(should have been 7852 characters)'
  1125. fi
  1126. fi # end of overwriting check
  1127. echo shar: extracting "'Graph.c'" '(10709 characters)'
  1128. if test -f 'Graph.c'
  1129. then
  1130.     echo shar: will not over-write existing file "'Graph.c'"
  1131. else
  1132. sed 's/^    X//' << \SHAR_EOF > 'Graph.c'
  1133.     X/***********************************************************
  1134.     XCopyright 1990 by Digital Equipment Corporation, Maynard, Massachusetts.
  1135.     X
  1136.     X                        All Rights Reserved
  1137.     X
  1138.     XPermission to use, copy, modify, and distribute these examples for any
  1139.     Xpurpose and without fee is hereby granted, provided that the above
  1140.     Xcopyright notice appear in all copies and that both that copyright
  1141.     Xnotice and this permission notice appear in supporting documentation,
  1142.     Xand that the name of Digital not be used in advertising or publicity
  1143.     Xpertaining to distribution of the software without specific, written
  1144.     Xprior permission.
  1145.     X
  1146.     XDIGITAL AND THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
  1147.     XSOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
  1148.     XFITNESS, IN NO EVENT SHALL DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT
  1149.     XOR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
  1150.     XOF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
  1151.     XOR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
  1152.     XOR PERFORMANCE OF THIS SOFTWARE.
  1153.     X
  1154.     X******************************************************************/
  1155.     X
  1156.     X#include <X11/IntrinsicP.h>    /* Intrinsics header file */
  1157.     X#include <X11/StringDefs.h>    /* Resource string definitions */
  1158.     X#include "GraphP.h"        /* Graph private header file */
  1159.     X#include "GraphDispP.h"        /* Graph display object */
  1160.     X
  1161.     X#define Offset(field) XtOffsetOf(GraphRec, graph.field)
  1162.     X
  1163.     Xstatic XtResource resources[] = {
  1164.     X    {XtNnumEntries, XtCNumEntries, XtRInt, sizeof(int),
  1165.     X    Offset(num_entries), XtRImmediate, (XtPointer) 0},
  1166.     X    {XtNlabels, XtCLabels, XtRStringTable, sizeof(String *),
  1167.     X        Offset(labels), XtRImmediate, (XtPointer) NULL},
  1168.     X    {XtNvalues, XtCValues, XtRPointer, sizeof(int *),
  1169.     X    Offset(values), XtRImmediate, (XtPointer) NULL},
  1170.     X    {XtNmaxValue, XtCMaxValue, XtRInt, sizeof(int),
  1171.     X    Offset(max_value), XtRImmediate, (XtPointer) 100},
  1172.     X    {XtNscale, XtCScale, XtRInt, sizeof(int),
  1173.     X        Offset(scale), XtRImmediate, (XtPointer) 1}
  1174.     X};
  1175.     X#undef Offset
  1176.     X
  1177.     X/* Forward declarations */
  1178.     X
  1179.     Xstatic void ClassInitialize(), Initialize(),
  1180.     X    Redisplay(), Destroy(), Resize(), Realize(),
  1181.     X    InsertChild();
  1182.     Xstatic Boolean SetValues();
  1183.     X
  1184.     Xstatic CompositeClassExtensionRec compositeExtension = {
  1185.     X    /* next_extension        */ NULL,
  1186.     X    /* record_type        */ NULLQUARK,
  1187.     X    /* version            */ XtCompositeExtensionVersion,
  1188.     X    /* record_size        */ sizeof(CompositeClassExtensionRec),
  1189.     X    /* accepts_objects        */ TRUE
  1190.     X};
  1191.     X
  1192.     XGraphClassRec graphClassRec = {
  1193.     X    /* Core class part */
  1194.     X  {
  1195.     X    /* superclass         */    (WidgetClass) &compositeClassRec,
  1196.     X    /* class_name         */    "Graph",
  1197.     X    /* widget_size         */    sizeof(GraphRec),
  1198.     X    /* class_initialize      */ ClassInitialize,
  1199.     X    /* class_part_initialize */    NULL,
  1200.     X    /* class_inited          */    FALSE,
  1201.     X    /* initialize         */    Initialize,
  1202.     X    /* initialize_hook       */    NULL,        
  1203.     X    /* realize             */    Realize,
  1204.     X    /* actions             */    NULL,
  1205.     X    /* num_actions         */    0,
  1206.     X    /* resources         */    resources,
  1207.     X    /* num_resources         */    XtNumber(resources),
  1208.     X    /* xrm_class         */    NULLQUARK,
  1209.     X    /* compress_motion         */    TRUE,
  1210.     X    /* compress_exposure     */    XtExposeCompressMultiple,
  1211.     X    /* compress_enterleave   */    TRUE,
  1212.     X    /* visible_interest         */    FALSE,
  1213.     X    /* destroy             */    Destroy,
  1214.     X    /* resize             */    Resize,
  1215.     X    /* expose             */    Redisplay,
  1216.     X    /* set_values         */    SetValues,
  1217.     X    /* set_values_hook       */    NULL,            
  1218.     X    /* set_values_almost     */    XtInheritSetValuesAlmost,  
  1219.     X    /* get_values_hook       */    NULL,            
  1220.     X    /* accept_focus         */    NULL,
  1221.     X    /* version             */    XtVersion,
  1222.     X    /* callback offsets      */ NULL,
  1223.     X    /* tm_table              */ NULL,
  1224.     X    /* query_geometry         */    NULL,
  1225.     X    /* display_accelerator   */ NULL,
  1226.     X    /* extension             */ NULL
  1227.     X  },
  1228.     X    /* Composite class part */
  1229.     X  {
  1230.     X    /* geometry_manager         */    NULL,
  1231.     X    /* change_managed         */    NULL,
  1232.     X    /* insert_child         */    InsertChild,
  1233.     X    /* delete_child         */    XtInheritDeleteChild,
  1234.     X    /* extension         */    (XtPointer) &compositeExtension,
  1235.     X  },
  1236.     X    /* Graph class part    */
  1237.     X  {
  1238.     X    /* extension             */ NULL
  1239.     X  }
  1240.     X};
  1241.     X
  1242.     X/* Class record pointer */
  1243.     X
  1244.     XWidgetClass graphWidgetClass = (WidgetClass) &graphClassRec;
  1245.     X
  1246.     Xstatic Boolean CvtStringToStringList(dpy, args, num_args,
  1247.     X    from, to, data)
  1248.     X    Display *dpy;
  1249.     X    XrmValuePtr args;
  1250.     X    Cardinal *num_args;
  1251.     X    XrmValuePtr from, to;
  1252.     X    XtPointer *data;
  1253.     X{
  1254.     X    register int i, count = 1;
  1255.     X    register char *ch, *start = from->addr;
  1256.     X    static String *list;
  1257.     X    int len;
  1258.     X
  1259.     X    if (*num_args != 0) {
  1260.     X    XtAppErrorMsg(XtDisplayToApplicationContext(dpy),
  1261.     X       "cvtStringToStringList", "wrongParameters",
  1262.     X       "XtToolkitError",
  1263.     X       "String to string list conversion needs no extra arguments",
  1264.     X       (String *) NULL, (Cardinal *) NULL);
  1265.     X    }
  1266.     X    if (to->addr != NULL && to->size < sizeof(String *)) {
  1267.     X    to->size = sizeof(String *);
  1268.     X    return FALSE;
  1269.     X    }
  1270.     X    if (start == NULL || *start == '\0') list = NULL;
  1271.     X    else {
  1272.     X    for (ch = start; *ch != '\0'; ch++) {    /* Count strings */
  1273.     X        if (*ch == '\n') count++;
  1274.     X    }
  1275.     X    list = (String *) XtCalloc(count+1, sizeof(String));
  1276.     X
  1277.     X    for (i = 0; i < count; i++) {
  1278.     X        for (ch = start; *ch != '\n' && *ch != '\0'; ch++) {}
  1279.     X        len = ch - start;
  1280.     X        list[i] = XtMalloc(len + 1);
  1281.     X        (void) strncpy(list[i], start, len);
  1282.     X        list[i][len] = '\0';
  1283.     X        start = ch + 1;
  1284.     X    }
  1285.     X    }
  1286.     X    if (to->addr == NULL) to->addr = (caddr_t) &list;
  1287.     X    else *(String **) to->addr = list;
  1288.     X    to->size = sizeof(String *);
  1289.     X    return TRUE;
  1290.     X}
  1291.     X
  1292.     Xstatic void StringListDestructor(app, to, converter_data,
  1293.     X    args, num_args)
  1294.     X    XtAppContext app;
  1295.     X    XrmValuePtr to;
  1296.     X    XtPointer converter_data;
  1297.     X    XrmValuePtr args;
  1298.     X    Cardinal *num_args;
  1299.     X{
  1300.     X    String *list = (String *) to->addr;
  1301.     X    register String *entry;
  1302.     X
  1303.     X    if (list == NULL) return;
  1304.     X
  1305.     X    for (entry = list; entry != NULL; entry++) {
  1306.     X    XtFree((XtPointer) entry);
  1307.     X    }
  1308.     X
  1309.     X    XtFree((XtPointer) list);
  1310.     X}
  1311.     X
  1312.     Xstatic void ClassInitialize()
  1313.     X{
  1314.     X    /* Register a converter for string to string list */
  1315.     X
  1316.     X    XtSetTypeConverter(XtRString, XtRStringTable,
  1317.     X        CvtStringToStringList, (XtConvertArgList) NULL, 0,
  1318.     X        XtCacheAll | XtCacheRefCount, StringListDestructor);
  1319.     X}
  1320.     X
  1321.     Xstatic void Initialize(request, new, args, num_args)
  1322.     X    Widget request, new;
  1323.     X    ArgList args;
  1324.     X    Cardinal *num_args;
  1325.     X{
  1326.     X    register GraphWidget gw = (GraphWidget) new;
  1327.     X    int *values;
  1328.     X    register int i;
  1329.     X    String label;
  1330.     X
  1331.     X    /* Copy the values */
  1332.     X    values = (int *) XtCalloc(gw->graph.num_entries, sizeof(int));
  1333.     X    for (i = 0; i < gw->graph.num_entries; i++) {
  1334.     X    values[i] = gw->graph.values[i];
  1335.     X    }
  1336.     X    gw->graph.values = values;
  1337.     X
  1338.     X    /* If labels is not NULL, make sure there are enough of them now
  1339.     X       to avoid an error some random other place. */
  1340.     X    if (gw->graph.labels != NULL) {
  1341.     X    for (i = 0; i < gw->graph.num_entries; i++) {
  1342.     X        label = gw->graph.labels[i];
  1343.     X    }
  1344.     X    }
  1345.     X}
  1346.     X
  1347.     Xstatic Boolean SetValues(old, req, new, args, num_args)
  1348.     X    Widget old, req, new;
  1349.     X    ArgList args;
  1350.     X    Cardinal *num_args;
  1351.     X{
  1352.     X    register GraphWidget oldgraph = (GraphWidget) old;
  1353.     X    register GraphWidget newgraph = (GraphWidget) new;
  1354.     X    int *values;
  1355.     X    String label;
  1356.     X    register int i;
  1357.     X
  1358.     X#define NE(field) (newgraph->graph.field != oldgraph->graph.field)
  1359.     X#define EQ(field) (newgraph->graph.field == oldgraph->graph.field)
  1360.     X
  1361.     X    if (NE(values)) {
  1362.     X    values = (int *) XtCalloc(newgraph->graph.num_entries,
  1363.     X        sizeof(int));
  1364.     X    XtFree(oldgraph->graph.values);
  1365.     X    for (i = 0; i < newgraph->graph.num_entries; i++) {
  1366.     X        values[i] = newgraph->graph.values[i];
  1367.     X    }
  1368.     X    newgraph->graph.values = values;
  1369.     X    return TRUE;
  1370.     X    }
  1371.     X
  1372.     X    /* If num_entries changed but not the labels or values,
  1373.     X       something's wrong */
  1374.     X    if (NE(num_entries) && (EQ(labels) || EQ(values))) {
  1375.     X    XtAppErrorMsg(XtWidgetToApplicationContext(new),
  1376.     X        "countError", "numEntries", "WidgetError",
  1377.     X        "Number of graph entries changed but not labels or values",
  1378.     X        (String *) NULL, (Cardinal *) NULL);
  1379.     X    }
  1380.     X
  1381.     X    if (NE(labels) && newgraph->graph.labels != NULL) {
  1382.     X    for (i = 0; i < newgraph->graph.num_entries; i++) {
  1383.     X        label = newgraph->graph.labels[i];
  1384.     X    }
  1385.     X    }
  1386.     X
  1387.     X    return NE(num_entries) || NE(labels) || NE(max_value);
  1388.     X#undef NE
  1389.     X}
  1390.     X
  1391.     Xstatic void Destroy(w)
  1392.     X    Widget w;
  1393.     X{
  1394.     X    GraphWidget gw = (GraphWidget) w;
  1395.     X
  1396.     X    XtFree((char *) gw->graph.values);
  1397.     X}
  1398.     X
  1399.     Xstatic void InsertChild(w)
  1400.     X    Widget w;
  1401.     X{
  1402.     X    String params[2];
  1403.     X    Cardinal num_params;
  1404.     X    CompositeWidget parent = (CompositeWidget) XtParent(w);
  1405.     X    GraphDisplayObjectClass childClass;
  1406.     X
  1407.     X    if (!XtIsSubclass(w, graphDisplayObjectClass)) {
  1408.     X    params[0] = XtClass(w)->core_class.class_name;
  1409.     X    params[1] = XtClass(parent)->core_class.class_name;
  1410.     X    num_params = 2;
  1411.     X    XtAppErrorMsg(XtWidgetToApplicationContext(w),
  1412.     X        "childError", "class", "WidgetError",
  1413.     X        "Children of class %s cannot be added to %n widgets",
  1414.     X        params, &num_params);
  1415.     X    }
  1416.     X
  1417.     X    if (parent->composite.num_children != 0) {
  1418.     X    params[0] = XtClass(parent)->core_class.class_name;
  1419.     X    num_params = 1;
  1420.     X    XtAppErrorMsg(XtWidgetToApplicationContext(w),
  1421.     X        "childError", "number", "WidgetError",
  1422.     X        "%s widgets can only take one child",
  1423.     X        params, &num_params);
  1424.     X    }
  1425.     X
  1426.     X    (*((CompositeWidgetClass)(graphWidgetClass->
  1427.     X        core_class.superclass))->composite_class.insert_child) (w);
  1428.     X
  1429.     X    /* Give the child a chance to compute our dimensions */
  1430.     X
  1431.     X    childClass = (GraphDisplayObjectClass) XtClass(w);
  1432.     X    if (childClass->graphDisplay_class.compute_size != NULL) {
  1433.     X    (*childClass->graphDisplay_class.compute_size) (parent);
  1434.     X    }
  1435.     X}
  1436.     X
  1437.     Xstatic void Realize(w, valueMask, attributes)
  1438.     X    Widget w;
  1439.     X    XtValueMask *valueMask;
  1440.     X    XSetWindowAttributes *attributes;
  1441.     X{
  1442.     X    GraphWidget gw = (GraphWidget) w;
  1443.     X    String params[2];
  1444.     X    Cardinal num_params;
  1445.     X
  1446.     X    if (gw->composite.num_children != 1) {
  1447.     X    params[0] = XtClass(w)->core_class.class_name;
  1448.     X    num_params = 1;
  1449.     X    XtAppErrorMsg(XtWidgetToApplicationContext(w),
  1450.     X        "childError", "number", "WidgetError",
  1451.     X        "%s widgets must have exactly one child",
  1452.     X        params, &num_params);
  1453.     X    }
  1454.     X
  1455.     X    (*graphWidgetClass->core_class.superclass->core_class.realize)
  1456.     X        (w, valueMask, attributes);
  1457.     X}
  1458.     X
  1459.     Xstatic void Redisplay(w, event, region)
  1460.     X    Widget w;
  1461.     X    XEvent *event;
  1462.     X    Region region;
  1463.     X{
  1464.     X    GraphWidget gw = (GraphWidget) w;
  1465.     X    GraphDisplayObject d =
  1466.     X        (GraphDisplayObject) gw->composite.children[0];
  1467.     X    GraphDisplayObjectClass childClass;
  1468.     X
  1469.     X    childClass = (GraphDisplayObjectClass) XtClass((Widget) d);
  1470.     X    if (childClass->graphDisplay_class.expose != NULL) {
  1471.     X    (*childClass->graphDisplay_class.expose) (w, event, region);
  1472.     X    }
  1473.     X}
  1474.     Xstatic void Resize(w)
  1475.     X    Widget w;
  1476.     X{
  1477.     X    /* If widget is realized, clear and redisplay */
  1478.     X
  1479.     X    if (XtIsRealized(w)) {
  1480.     X    XClearWindow(XtDisplay(w), XtWindow(w));
  1481.     X    (*(XtClass(w)->core_class.expose))(w,
  1482.     X        (XEvent *) NULL, (Region) NULL);
  1483.     X    }
  1484.     X}   
  1485. SHAR_EOF
  1486. if test 10709 -ne "`wc -c < 'Graph.c'`"
  1487. then
  1488.     echo shar: error transmitting "'Graph.c'" '(should have been 10709 characters)'
  1489. fi
  1490. fi # end of overwriting check
  1491. echo shar: extracting "'GraphDispl.c'" '(5482 characters)'
  1492. if test -f 'GraphDispl.c'
  1493. then
  1494.     echo shar: will not over-write existing file "'GraphDispl.c'"
  1495. else
  1496. sed 's/^    X//' << \SHAR_EOF > 'GraphDispl.c'
  1497.     X/***********************************************************
  1498.     XCopyright 1990 by Digital Equipment Corporation, Maynard, Massachusetts.
  1499.     X
  1500.     X                        All Rights Reserved
  1501.     X
  1502.     XPermission to use, copy, modify, and distribute these examples for any
  1503.     Xpurpose and without fee is hereby granted, provided that the above
  1504.     Xcopyright notice appear in all copies and that both that copyright
  1505.     Xnotice and this permission notice appear in supporting documentation,
  1506.     Xand that the name of Digital not be used in advertising or publicity
  1507.     Xpertaining to distribution of the software without specific, written
  1508.     Xprior permission.
  1509.     X
  1510.     XDIGITAL AND THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
  1511.     XSOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
  1512.     XFITNESS, IN NO EVENT SHALL DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT
  1513.     XOR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
  1514.     XOF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
  1515.     XOR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
  1516.     XOR PERFORMANCE OF THIS SOFTWARE.
  1517.     X
  1518.     X******************************************************************/
  1519.     X
  1520.     X#include <X11/IntrinsicP.h>    /* Intrinsics header file */
  1521.     X#include <X11/StringDefs.h>    /* Resource string definitions */
  1522.     X#include "GraphDispP.h"        /* Graph display object */
  1523.     X
  1524.     X#define Offset(field) XtOffsetOf(GraphDisplayRec, graphDisplay.field)
  1525.     X
  1526.     Xstatic XtResource resources[] = {
  1527.     X    {XtNfont,  XtCFont, XtRFontStruct, sizeof(XFontStruct *),
  1528.     X    Offset(font), XtRString, (XtPointer) XtDefaultFont},
  1529.     X    {XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel),
  1530.     X    Offset(foreground), XtRString,
  1531.     X    (XtPointer) XtDefaultForeground},
  1532.     X};
  1533.     X#undef Offset
  1534.     X
  1535.     X/* Forward declarations */
  1536.     X
  1537.     Xstatic void ClassPartInitialize(), Initialize(), Destroy();
  1538.     Xstatic Boolean SetValues();
  1539.     X
  1540.     X/* Class record declaration */
  1541.     X
  1542.     XGraphDisplayClassRec graphDisplayClassRec = {
  1543.     X    /* Object class part */
  1544.     X  {
  1545.     X    /* superclass         */    (WidgetClass) &objectClassRec,
  1546.     X    /* class_name         */    "GraphDisplay",
  1547.     X    /* widget_size         */    sizeof(GraphDisplayRec),
  1548.     X    /* class_initialize      */ NULL,
  1549.     X    /* class_part_initialize */    ClassPartInitialize,
  1550.     X    /* class_inited          */    FALSE,
  1551.     X    /* initialize         */    Initialize,
  1552.     X    /* initialize_hook       */    NULL,        
  1553.     X    /* obj1             */    NULL,
  1554.     X    /* obj2             */    NULL,
  1555.     X    /* obj3             */    0,
  1556.     X    /* resources         */    resources,
  1557.     X    /* num_resources         */    XtNumber(resources),
  1558.     X    /* xrm_class         */    NULLQUARK,
  1559.     X    /* obj4             */    0,
  1560.     X    /* obj5             */    0,
  1561.     X    /* obj6             */    0,
  1562.     X    /* obj7             */    0,
  1563.     X    /* destroy             */    Destroy,
  1564.     X    /* obj8             */    NULL,
  1565.     X    /* obj9             */    NULL,
  1566.     X    /* set_values         */    SetValues,
  1567.     X    /* set_values_hook       */    NULL,            
  1568.     X    /* obj10             */    NULL,  
  1569.     X    /* get_values_hook       */    NULL,            
  1570.     X    /* obj11             */    NULL,
  1571.     X    /* version             */    XtVersion,
  1572.     X    /* callback offsets      */ NULL,
  1573.     X    /* obj12             */ NULL,
  1574.     X    /* obj13             */    NULL,
  1575.     X    /* obj14             */ NULL,
  1576.     X    /* extension             */ NULL
  1577.     X  },
  1578.     X    /* GraphDisplay class part    */
  1579.     X  {
  1580.     X    /* compute_size         */ NULL,
  1581.     X    /* expose             */ NULL,
  1582.     X    /* extension             */ NULL
  1583.     X  }
  1584.     X};
  1585.     X
  1586.     X/* Class record pointer */
  1587.     X
  1588.     XWidgetClass graphDisplayObjectClass =
  1589.     X    (WidgetClass) &graphDisplayClassRec;
  1590.     X
  1591.     Xstatic void ClassPartInitialize(widgetClass)
  1592.     X    WidgetClass widgetClass;
  1593.     X{
  1594.     X    register GraphDisplayObjectClass wc = 
  1595.     X        (GraphDisplayObjectClass) widgetClass;
  1596.     X    GraphDisplayObjectClass super =
  1597.     X        (GraphDisplayObjectClass) wc->object_class.superclass;
  1598.     X
  1599.     X    if (wc->graphDisplay_class.compute_size == InheritComputeSize) {
  1600.     X    wc->graphDisplay_class.compute_size =
  1601.     X        super->graphDisplay_class.compute_size;
  1602.     X    }
  1603.     X
  1604.     X    if (wc->graphDisplay_class.expose == XtInheritExpose) {
  1605.     X    wc->graphDisplay_class.expose =
  1606.     X        super->graphDisplay_class.expose;
  1607.     X    }
  1608.     X}
  1609.     X
  1610.     Xstatic GC GetGC(gd)
  1611.     X    GraphDisplayObject gd;
  1612.     X{
  1613.     X    XGCValues    values;
  1614.     X
  1615.     X    /* Allocate a graphics context with the foreground and font */
  1616.     X
  1617.     X    values.foreground = gd->graphDisplay.foreground;
  1618.     X    values.font = gd->graphDisplay.font->fid;
  1619.     X
  1620.     X    return XtGetGC(XtParent((Widget) gd),
  1621.     X        GCForeground | GCFont, &values);
  1622.     X}
  1623.     X
  1624.     Xstatic void Initialize(request, new, args, num_args)
  1625.     X    Widget request, new;
  1626.     X    ArgList args;
  1627.     X    Cardinal *num_args;
  1628.     X{
  1629.     X    GraphDisplayObject gd = (GraphDisplayObject) new;
  1630.     X
  1631.     X    /* Get a graphics context */
  1632.     X    gd->graphDisplay.gc = GetGC(gd);
  1633.     X}
  1634.     X
  1635.     Xstatic Boolean SetValues(old, request, new, args, num_args)
  1636.     X    Widget  old, request, new;
  1637.     X    ArgList args;
  1638.     X    Cardinal *num_args;
  1639.     X{
  1640.     X    GraphDisplayObject oldgd = (GraphDisplayObject) old;
  1641.     X    GraphDisplayObject newgd = (GraphDisplayObject) new;
  1642.     X
  1643.     X#define NE(field) (oldgd->field != newgd->field)
  1644.     X
  1645.     X    /* If foreground or font has changed, update GC */
  1646.     X
  1647.     X    if (NE(graphDisplay.foreground) || NE(graphDisplay.font->fid)) {
  1648.     X    XtReleaseGC(newgd, oldgd->graphDisplay.gc);
  1649.     X    newgd->graphDisplay.gc = GetGC(newgd);
  1650.     X
  1651.     X    /* Kludge.  There's no way to tell the Intrinsics to
  1652.     X       automatically redisplay, so clear the parent, causing
  1653.     X       expose events.  Subclasses will do this too, but multiple
  1654.     X       redisplays are avoided since the parent has
  1655.     X       XtExposeCompressMultiple. */
  1656.     X
  1657.     X    if (XtIsRealized(XtParent((Widget) newgd))) {
  1658.     X        XClearArea(XtDisplayOfObject(newgd),
  1659.     X            XtWindowOfObject(newgd), 0, 0, 0, 0, TRUE);
  1660.     X    }
  1661.     X    }
  1662.     X
  1663.     X    return FALSE;
  1664.     X#undef NE
  1665.     X}
  1666.     Xstatic void Destroy(w)
  1667.     X    Widget w;
  1668.     X{
  1669.     X    GraphDisplayObject gd = (GraphDisplayObject) w;
  1670.     X
  1671.     X    XtReleaseGC(XtParent(w), gd->graphDisplay.gc);
  1672.     X}
  1673. SHAR_EOF
  1674. if test 5482 -ne "`wc -c < 'GraphDispl.c'`"
  1675. then
  1676.     echo shar: error transmitting "'GraphDispl.c'" '(should have been 5482 characters)'
  1677. fi
  1678. fi # end of overwriting check
  1679. echo shar: extracting "'Label.c'" '(16084 characters)'
  1680. if test -f 'Label.c'
  1681. then
  1682.     echo shar: will not over-write existing file "'Label.c'"
  1683. else
  1684. sed 's/^    X//' << \SHAR_EOF > 'Label.c'
  1685.     X/***********************************************************
  1686.     XCopyright 1990 by Digital Equipment Corporation, Maynard, Massachusetts.
  1687.     X
  1688.     X                        All Rights Reserved
  1689.     X
  1690.     XPermission to use, copy, modify, and distribute these examples for any
  1691.     Xpurpose and without fee is hereby granted, provided that the above
  1692.     Xcopyright notice appear in all copies and that both that copyright
  1693.     Xnotice and this permission notice appear in supporting documentation,
  1694.     Xand that the name of Digital not be used in advertising or publicity
  1695.     Xpertaining to distribution of the software without specific, written
  1696.     Xprior permission.
  1697.     X
  1698.     XDIGITAL AND THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
  1699.     XSOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
  1700.     XFITNESS, IN NO EVENT SHALL DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT
  1701.     XOR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
  1702.     XOF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
  1703.     XOR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
  1704.     XOR PERFORMANCE OF THIS SOFTWARE.
  1705.     X
  1706.     X******************************************************************/
  1707.     X
  1708.     X#include <X11/Xos.h>        /* Needed for string manipulation */
  1709.     X#include <X11/IntrinsicP.h>    /* Intrinsics header file */
  1710.     X#include <X11/StringDefs.h>    /* Resource string definitions */
  1711.     X#include <X11/Xatom.h>        /* For selection atoms */
  1712.     X#include "LabelP.h"        /* Label private header file */
  1713.     X
  1714.     X#define Offset(field) XtOffsetOf(LabelRec, label.field)
  1715.     X
  1716.     Xstatic XtResource resources[] = {
  1717.     X    {XtNlabel, XtCLabel, XtRString, sizeof(String),
  1718.     X    Offset(label), XtRString, (XtPointer) NULL},
  1719.     X    {XtNfont,  XtCFont, XtRFontStruct, sizeof(XFontStruct *),
  1720.     X    Offset(font), XtRString, (XtPointer) XtDefaultFont},
  1721.     X    {XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel),
  1722.     X    Offset(foreground), XtRString,
  1723.     X    (XtPointer) XtDefaultForeground},
  1724.     X    {XtNjustify, XtCJustify, XtRJustify, sizeof(Justify),
  1725.     X    Offset(justify), XtRImmediate, (XtPointer) Left},
  1726.     X    {XtNspace, XtCSpace, XtRDimension, sizeof(Dimension),
  1727.     X    Offset(space), XtRImmediate, (XtPointer) 2},
  1728.     X    {XtNloseSelection, XtCLoseSelection, XtRCallback, 
  1729.     X    sizeof(XtCallbackList), Offset(lose_selection),
  1730.     X    XtRCallback, (XtPointer) NULL},
  1731.     X    {XtNborderWidth, XtCBorderWidth, XtRDimension, sizeof(Dimension),
  1732.     X        XtOffsetOf(LabelRec, core.border_width),
  1733.     X    XtRImmediate, (XtPointer) 0},
  1734.     X};
  1735.     X#undef Offset
  1736.     X
  1737.     X/* Forward declarations */
  1738.     X
  1739.     Xstatic void ClassInitialize(), ClassPartInitialize(), Initialize(),
  1740.     X    Redisplay(), Destroy(), Resize(), LoseSelection();
  1741.     Xstatic Boolean SetValues(), SelectText();
  1742.     Xstatic XtGeometryResult QueryGeometry();
  1743.     X
  1744.     X/* Class record declaration */
  1745.     X
  1746.     XLabelClassRec labelClassRec = {
  1747.     X    /* Core class part */
  1748.     X  {
  1749.     X    /* superclass         */    (WidgetClass) &widgetClassRec,
  1750.     X    /* class_name         */    "Label",
  1751.     X    /* widget_size         */    sizeof(LabelRec),
  1752.     X    /* class_initialize      */ ClassInitialize,
  1753.     X    /* class_part_initialize */    ClassPartInitialize,
  1754.     X    /* class_inited          */    FALSE,
  1755.     X    /* initialize         */    Initialize,
  1756.     X    /* initialize_hook       */    NULL,        
  1757.     X    /* realize             */    XtInheritRealize,
  1758.     X    /* actions             */    NULL,
  1759.     X    /* num_actions         */    0,
  1760.     X    /* resources         */    resources,
  1761.     X    /* num_resources         */    XtNumber(resources),
  1762.     X    /* xrm_class         */    NULLQUARK,
  1763.     X    /* compress_motion         */    TRUE,
  1764.     X    /* compress_exposure     */    XtExposeCompressMultiple,
  1765.     X    /* compress_enterleave   */    TRUE,
  1766.     X    /* visible_interest         */    FALSE,
  1767.     X    /* destroy             */    Destroy,
  1768.     X    /* resize             */    Resize,
  1769.     X    /* expose             */    Redisplay,
  1770.     X    /* set_values         */    SetValues,
  1771.     X    /* set_values_hook       */    NULL,            
  1772.     X    /* set_values_almost     */    XtInheritSetValuesAlmost,  
  1773.     X    /* get_values_hook       */    NULL,            
  1774.     X    /* accept_focus         */    NULL,
  1775.     X    /* version             */    XtVersion,
  1776.     X    /* callback offsets      */ NULL,
  1777.     X    /* tm_table              */ NULL,
  1778.     X    /* query_geometry         */    QueryGeometry,
  1779.     X    /* display_accelerator   */ NULL,
  1780.     X    /* extension             */ NULL
  1781.     X  },
  1782.     X    /* Label class part    */
  1783.     X  {
  1784.     X    /* select             */ SelectText,
  1785.     X    /* extension             */ NULL
  1786.     X  }
  1787.     X};
  1788.     X
  1789.     X/* Class record pointer */
  1790.     X
  1791.     XWidgetClass labelWidgetClass = (WidgetClass) &labelClassRec;
  1792.     X
  1793.     Xstatic Boolean LowerCase(from, to, size)
  1794.     X    register String from, to;
  1795.     X    int size;
  1796.     X{
  1797.     X    register char ch;
  1798.     X    register int i;
  1799.     X
  1800.     X    for (i = 0; i < size; i++) {
  1801.     X    ch = from[i];
  1802.     X    if (ch >= 'A' && ch <= 'Z') to[i] = ch - 'A' + 'a';
  1803.     X    else to[i] = ch;
  1804.     X    if (ch == '\0') return FALSE;
  1805.     X    }
  1806.     X    return TRUE;
  1807.     X}
  1808.     X
  1809.     XBoolean CvtStringToJustify(dpy, args, num_args, from, to, data)
  1810.     X    Display *dpy;
  1811.     X    XrmValuePtr args;
  1812.     X    Cardinal *num_args;
  1813.     X    XrmValuePtr from, to;
  1814.     X    XtPointer *data;
  1815.     X{
  1816.     X#define LOWER_SIZE 10
  1817.     X    char lower[LOWER_SIZE];    /* Lower cased string value */
  1818.     X    register int i;
  1819.     X    Boolean badConvert;
  1820.     X    static Justify j;
  1821.     X
  1822.     X    if (*num_args != 0) {    /* Check for correct number */
  1823.     X    XtAppErrorMsg(XtDisplayToApplicationContext(dpy),
  1824.     X           "cvtStringToJustify", "wrongParameters",
  1825.     X           "XtToolkitError",
  1826.     X           "String to justify conversion needs no extra arguments",
  1827.     X           (String *) NULL, (Cardinal *) NULL);
  1828.     X    }
  1829.     X
  1830.     X    /* Lower case the value */
  1831.     X    badConvert = LowerCase(from->addr, lower, LOWER_SIZE);
  1832.     X
  1833.     X    /* Try to convert if a short enough string specified */
  1834.     X    if (!badConvert) {
  1835.     X    if (strcmp(lower, "left") == 0) j = Left;
  1836.     X    else if (strcmp(lower, "center") == 0) j = Center;
  1837.     X    else if (strcmp(lower, "right") == 0) j = Right;
  1838.     X    else badConvert = TRUE;
  1839.     X    }
  1840.     X
  1841.     X    /* String too long or unknown value -- issue warning */
  1842.     X    if (badConvert) {
  1843.     X    XtDisplayStringConversionWarning(dpy, from->addr, "Justify");
  1844.     X    } else {
  1845.     X    if (to->addr == NULL) to->addr = (caddr_t) &j;
  1846.     X    else if (to->size < sizeof(Justify)) badConvert = TRUE;
  1847.     X    else *(Justify *) to->addr = j;
  1848.     X
  1849.     X    to->size = sizeof(Justify);
  1850.     X    }
  1851.     X    return !badConvert;
  1852.     X#undef LOWER_SIZE
  1853.     X}
  1854.     X
  1855.     X#if 0
  1856.     XBoolean CvtStringToJustify(dpy, args, num_args, from, to, data)
  1857.     X    Display *dpy;
  1858.     X    XrmValuePtr args;
  1859.     X    Cardinal *num_args;
  1860.     X    XrmValuePtr from, to;
  1861.     X    XtPointer *data;
  1862.     X{
  1863.     X#define LOWER_SIZE 10
  1864.     X    char lower[LOWER_SIZE];    /* Lower cased string value */
  1865.     X    register int i;
  1866.     X    Boolean badConvert;
  1867.     X    XrmQuark q;
  1868.     X    static Justify j;
  1869.     X    static XrmQuark Qleft, Qcenter, Qright;
  1870.     X    static Boolean haveQuarks = FALSE;
  1871.     X
  1872.     X    if (*num_args != 0) {    /* Check for correct number */
  1873.     X    XtAppErrorMsg(XtDisplayToApplicationContext(dpy),
  1874.     X           "cvtStringToJustify", "wrongParameters",
  1875.     X           "XtToolkitError",
  1876.     X           "String to justify conversion needs no extra arguments",
  1877.     X           (String *) NULL, (Cardinal *) NULL);
  1878.     X    }
  1879.     X
  1880.     X    if (!haveQuarks) {
  1881.     X    Qleft   = XrmStringToQuark("left");
  1882.     X    Qcenter = XrmStringToQuark("center");
  1883.     X    Qright  = XrmStringToQuark("right");
  1884.     X    haveQuarks = TRUE;
  1885.     X    }
  1886.     X
  1887.     X    badConvert = LowerCase(from->addr, lower, LOWER_SIZE);
  1888.     X
  1889.     X    /* Try to convert if a short enough string specified */
  1890.     X
  1891.     X    if (!badConvert) {
  1892.     X    q = XrmStringToQuark(lower);
  1893.     X    if (q == Qleft) j = Left;
  1894.     X    else if (q == Qcenter) j = Center;
  1895.     X    else if (q == Qright) j = Right;
  1896.     X    else badConvert = TRUE;
  1897.     X    }
  1898.     X
  1899.     X    /* String too long or unknown value -- issue warning */
  1900.     X
  1901.     X    if (badConvert) {
  1902.     X    XtDisplayStringConversionWarning(dpy, from->addr, "Justify");
  1903.     X    } else {
  1904.     X    if (to->addr == NULL) to->addr = (caddr_t) &j;
  1905.     X    else if (to->size < sizeof(Justify)) badConvert = TRUE;
  1906.     X    else *(Justify *) to->addr = j;
  1907.     X
  1908.     X    to->size = sizeof(Justify);
  1909.     X    }
  1910.     X    return !badConvert;
  1911.     X#undef LOWER_SIZE
  1912.     X}
  1913.     X#endif
  1914.     X
  1915.     Xstatic Atom FetchAtom(w, name)
  1916.     X    Widget w;
  1917.     X    String name;
  1918.     X{
  1919.     X    Atom a;
  1920.     X    XrmValue source, dest;
  1921.     X
  1922.     X    source.size = strlen(name)+1;
  1923.     X    source.addr = name;
  1924.     X    dest.size = sizeof(Atom);
  1925.     X    dest.addr = (caddr_t) &a;
  1926.     X    
  1927.     X    (void) XtConvertAndStore(w, XtRString, &source, XtRAtom, &dest);
  1928.     X    return a;
  1929.     X}
  1930.     X    
  1931.     Xstatic Boolean DeliverSelection(w, selection, target,
  1932.     X    type, value, length, format)
  1933.     X    Widget w;
  1934.     X    Atom *selection, *target, *type;
  1935.     X    XtPointer *value;
  1936.     X    unsigned long *length;
  1937.     X    int *format;
  1938.     X{
  1939.     X    LabelWidget lw = (LabelWidget) w;
  1940.     X    static Atom targets = 0;
  1941.     X
  1942.     X    if (targets == 0) {
  1943.     X    targets = FetchAtom(w, "TARGETS");
  1944.     X    }
  1945.     X
  1946.     X    if (*target == targets) {
  1947.     X    *type = XA_ATOM;
  1948.     X    *value = (XtPointer) XtNew(Atom);
  1949.     X    *(Atom *) *value = XA_STRING;
  1950.     X    *length = 1;
  1951.     X    *format = 32;
  1952.     X    return TRUE;
  1953.     X    }
  1954.     X
  1955.     X    if (*target == XA_STRING) {
  1956.     X    *type = XA_STRING;
  1957.     X    *value = (XtPointer) XtNewString(lw->label.label);
  1958.     X    *length = lw->label.label_len;
  1959.     X    *format = 8;
  1960.     X    return TRUE;
  1961.     X    }
  1962.     X
  1963.     X    return FALSE;    
  1964.     X}
  1965.     X
  1966.     Xstatic void LoseSelection(w, selection)
  1967.     X    Widget w;
  1968.     X    Atom *selection;
  1969.     X{
  1970.     X    LabelWidget lw = (LabelWidget) w;
  1971.     X
  1972.     X    XtCallCallbackList(lw, lw->label.lose_selection,
  1973.     X        (XtPointer) selection);
  1974.     X}
  1975.     X
  1976.     X/* Label's select implementation */
  1977.     X
  1978.     Xstatic Boolean SelectText(w, selection, own)
  1979.     X    Widget w;
  1980.     X    Atom selection;
  1981.     X    Boolean own;
  1982.     X{
  1983.     X    LabelWidget lw = (LabelWidget) w;
  1984.     X
  1985.     X    if (own) {
  1986.     X    return XtOwnSelection(w, selection,
  1987.     X        XtLastTimestampProcessed(XtDisplay(w)),
  1988.     X        DeliverSelection, LoseSelection,
  1989.     X        (XtSelectionDoneProc) NULL);
  1990.     X    } else {
  1991.     X    XtDisownSelection(w, selection,
  1992.     X        XtLastTimestampProcessed(XtDisplay(w)));
  1993.     X    return TRUE;
  1994.     X    }
  1995.     X}
  1996.     X
  1997.     XBoolean LabelSelectText(w, selection, own)
  1998.     X    Widget w;
  1999.     X    Atom selection;
  2000.     X    Boolean own;
  2001.     X{
  2002.     X    /* Check that we're in Label or a subclass */
  2003.     X
  2004.     X    XtCheckSubclass(w, labelWidgetClass, NULL);
  2005.     X
  2006.     X    /* Call the class method */
  2007.     X
  2008.     X    return (*((LabelWidgetClass) XtClass(w))->label_class.select)
  2009.     X        (w, selection, own);
  2010.     X}
  2011.     X
  2012.     Xstatic void ClassInitialize()
  2013.     X{
  2014.     X    /* Register a converter for string to justification */
  2015.     X
  2016.     X    XtSetTypeConverter(XtRString, XtRJustify, CvtStringToJustify,
  2017.     X        (XtConvertArgList) NULL, 0,
  2018.     X        XtCacheAll, (XtDestructor) NULL);
  2019.     X}
  2020.     X
  2021.     Xstatic void ClassPartInitialize(widget_class)
  2022.     X    WidgetClass widget_class;
  2023.     X{
  2024.     X    register LabelWidgetClass wc = (LabelWidgetClass) widget_class;
  2025.     X    LabelWidgetClass super =
  2026.     X        (LabelWidgetClass) wc->core_class.superclass;
  2027.     X
  2028.     X    if (wc->label_class.select == InheritSelectText) {
  2029.     X    wc->label_class.select = super->label_class.select;
  2030.     X    }
  2031.     X}
  2032.     X
  2033.     Xstatic void SetTextWidthAndHeight(lw)
  2034.     X    register LabelWidget lw;
  2035.     X{
  2036.     X    register XFontStruct *fs = lw->label.font;
  2037.     X    int accel_len;
  2038.     X
  2039.     X    lw->label.label_len = strlen(lw->label.label);
  2040.     X    lw->label.label_width =
  2041.     X        XTextWidth(fs, lw->label.label, lw->label.label_len);
  2042.     X    lw->label.label_height =
  2043.     X        fs->max_bounds.ascent + fs->max_bounds.descent;
  2044.     X
  2045.     X    if (lw->label.accel_string != NULL) {
  2046.     X    accel_len = strlen(lw->label.accel_string);
  2047.     X    lw->label.label_len += accel_len;
  2048.     X    lw->label.label_width +=
  2049.     X        XTextWidth(fs, lw->label.accel_string, accel_len);
  2050.     X    }
  2051.     X}
  2052.     X
  2053.     Xstatic GC GetNormalGC(lw)
  2054.     X    LabelWidget lw;
  2055.     X{
  2056.     X    XGCValues    values;
  2057.     X
  2058.     X    /* Allocate a graphics context with the foreground and font */
  2059.     X
  2060.     X    values.foreground = lw->label.foreground;
  2061.     X    values.font = lw->label.font->fid;
  2062.     X    return XtGetGC((Widget) lw, GCForeground | GCFont, &values);
  2063.     X}
  2064.     X
  2065.     Xstatic void Initialize(request, new, args, num_args)
  2066.     X    Widget request, new;
  2067.     X    ArgList args;
  2068.     X    Cardinal *num_args;
  2069.     X{
  2070.     X    LabelWidget lw = (LabelWidget) new;
  2071.     X
  2072.     X    /* If no label is specified, use the name */
  2073.     X    if (lw->label.label == NULL) lw->label.label = lw->core.name;
  2074.     X
  2075.     X    /* Copy the label */
  2076.     X    lw->label.label = XtNewString(lw->label.label);
  2077.     X
  2078.     X    /* Clear accelerator string */
  2079.     X    lw->label.accel_string = NULL;
  2080.     X
  2081.     X    /* Compute the text dimensions and get a graphics context. */
  2082.     X    SetTextWidthAndHeight(lw);
  2083.     X    lw->label.gc = lw->label.current_gc = GetNormalGC(lw);
  2084.     X
  2085.     X    /* If no size specified, compute one */
  2086.     X    lw->label.size_computed =
  2087.     X        (lw->core.width == 0) && (lw->core.height == 0);
  2088.     X
  2089.     X    if (lw->core.width == 0) {
  2090.     X    lw->core.width = lw->label.label_width + 2 * lw->label.space;
  2091.     X    }
  2092.     X    if (lw->core.height == 0) {
  2093.     X    lw->core.height = lw->label.label_height + 2 * lw->label.space;
  2094.     X    }
  2095.     X
  2096.     X    lw->label.desired_width = lw->core.width;
  2097.     X    lw->label.desired_height = lw->core.height;
  2098.     X}
  2099.     X
  2100.     Xstatic Boolean SetValues(old, request, new, args, num_args)
  2101.     X    Widget  old, request, new;
  2102.     X    ArgList args;
  2103.     X    Cardinal *num_args;
  2104.     X{
  2105.     X    LabelWidget oldlw = (LabelWidget) old;
  2106.     X    LabelWidget newlw = (LabelWidget) new;
  2107.     X    Boolean redisplay = FALSE;
  2108.     X
  2109.     X#define NE(field) (oldlw->field != newlw->field)
  2110.     X
  2111.     X    /* If the label has been reset to NULL, change to the name */
  2112.     X
  2113.     X    if (newlw->label.label == NULL) {
  2114.     X    newlw->label.label = newlw->core.name;
  2115.     X    }
  2116.     X
  2117.     X    /* Decide whether to compute the size */
  2118.     X
  2119.     X    if (newlw->core.width == 0 && newlw->core.height == 0) {
  2120.     X    newlw->label.size_computed = TRUE;
  2121.     X    } else if (NE(core.width) || NE(core.height)) {
  2122.     X    newlw->label.size_computed = FALSE;
  2123.     X    if (NE(core.width)) {
  2124.     X        newlw->label.desired_width = newlw->core.width;
  2125.     X    }
  2126.     X    if (NE(core.height)) {
  2127.     X        newlw->label.desired_height = newlw->core.height;
  2128.     X    }
  2129.     X    } /* else leave the same */
  2130.     X
  2131.     X    /* If label, font, or accelerator string has changed, 
  2132.     X       compute size and recopy */
  2133.     X
  2134.     X    if (NE(label.label) || NE(label.font) || NE(label.accel_string)) {
  2135.     X    SetTextWidthAndHeight(newlw);
  2136.     X    redisplay = TRUE;
  2137.     X
  2138.     X    if (NE(label.label)) {
  2139.     X        XtFree((char *) oldlw->label.label);
  2140.     X        newlw->label.label = XtNewString(newlw->label.label);
  2141.     X    }
  2142.     X
  2143.     X    if (NE(label.accel_string)) {
  2144.     X        XtFree((char *) oldlw->label.accel_string);
  2145.     X        newlw->label.accel_string =
  2146.     X            XtNewString(newlw->label.accel_string);
  2147.     X    }
  2148.     X    }
  2149.     X
  2150.     X    /* Compute the size if necessary */
  2151.     X
  2152.     X    if ((newlw->label.size_computed && redisplay) ||
  2153.     X        newlw->core.width == 0) {
  2154.     X    newlw->label.desired_width = newlw->core.width =
  2155.     X        newlw->label.label_width + 2 * newlw->label.space;
  2156.     X    }
  2157.     X    if ((newlw->label.size_computed && redisplay) ||
  2158.     X        newlw->core.height == 0) {
  2159.     X    newlw->label.desired_height = newlw->core.height =
  2160.     X        newlw->label.label_height + 2 * newlw->label.space;
  2161.     X    }
  2162.     X    
  2163.     X    /* If foreground or font has changed, update GC */
  2164.     X
  2165.     X    if (NE(label.foreground) || NE(label.font->fid)) {
  2166.     X    XtReleaseGC(newlw, oldlw->label.gc);
  2167.     X    newlw->label.gc = GetNormalGC(newlw);
  2168.     X
  2169.     X    if (newlw->label.current_gc == oldlw->label.gc) {
  2170.     X        newlw->label.current_gc = newlw->label.gc;
  2171.     X        redisplay = TRUE;
  2172.     X    }
  2173.     X    }
  2174.     X
  2175.     X    return redisplay || NE(label.space) || NE(label.justify);
  2176.     X#undef NE
  2177.     X}
  2178.     X
  2179.     Xstatic void Destroy(w)
  2180.     X    Widget w;
  2181.     X{
  2182.     X    LabelWidget lw = (LabelWidget) w;
  2183.     X
  2184.     X    XtFree((char *) lw->label.label);
  2185.     X    XtReleaseGC(w, lw->label.gc);
  2186.     X}
  2187.     X
  2188.     Xstatic void Redisplay(w, event, region)
  2189.     X    Widget w;
  2190.     X    XEvent *event;
  2191.     X    Region region;
  2192.     X{
  2193.     X    LabelWidget lw = (LabelWidget) w;
  2194.     X    char *string;
  2195.     X    Boolean allocated = FALSE;
  2196.     X    int x;
  2197.     X
  2198.     X    if (lw->label.accel_string == NULL) {
  2199.     X    string = lw->label.label;
  2200.     X    } else {
  2201.     X    string = XtMalloc(lw->label.label_len + 1);
  2202.     X    (void) strcpy(string, lw->label.label);
  2203.     X    (void) strcat(string, lw->label.accel_string);
  2204.     X    allocated = TRUE;
  2205.     X    }
  2206.     X
  2207.     X    switch (lw->label.justify) {
  2208.     X    case Left:
  2209.     X        x = lw->label.space;    
  2210.     X        break;
  2211.     X    case Right:
  2212.     X        x = (int) lw->core.width - (int) lw->label.space -
  2213.     X            (int) lw->label.label_width;
  2214.     X        break;
  2215.     X    case Center:
  2216.     X        x = ((int) lw->core.width -
  2217.     X            (int) lw->label.label_width) / 2;
  2218.     X        break;
  2219.     X    }
  2220.     X
  2221.     X    XDrawString(XtDisplay(w), XtWindow(w), lw->label.current_gc,
  2222.     X        x, lw->label.space + lw->label.font->max_bounds.ascent,
  2223.     X        string, lw->label.label_len);
  2224.     X
  2225.     X    if (allocated) XtFree(string);
  2226.     X}
  2227.     X
  2228.     Xstatic void Resize(w)
  2229.     X    Widget w;
  2230.     X{
  2231.     X    /* If widget is realized, clear and redisplay */
  2232.     X
  2233.     X    if (XtIsRealized(w)) {
  2234.     X    XClearWindow(XtDisplay(w), XtWindow(w));
  2235.     X    (*(XtClass(w)->core_class.expose))(w,
  2236.     X        (XEvent *) NULL, (Region) NULL);
  2237.     X    }
  2238.     X}   
  2239.     X
  2240.     Xstatic XtGeometryResult QueryGeometry(w, proposed, desired)
  2241.     X    Widget w;
  2242.     X    XtWidgetGeometry *proposed, *desired;
  2243.     X{
  2244.     X    LabelWidget lw = (LabelWidget) w;
  2245.     X#define Set(bit) (proposed->request_mode & bit)
  2246.     X
  2247.     X    desired->width = lw->label.desired_width;
  2248.     X    desired->height = lw->label.desired_height;
  2249.     X    desired->request_mode = CWWidth | CWHeight;
  2250.     X
  2251.     X    if (Set(CWWidth) && proposed->width == desired->width &&
  2252.     X        Set(CWHeight) && proposed->height == desired->height) {
  2253.     X    return XtGeometryYes;
  2254.     X    }
  2255.     X
  2256.     X    if (desired->width == lw->core.width &&
  2257.     X        desired->height == lw->core.height) {
  2258.     X    return XtGeometryNo;
  2259.     X    }
  2260.     X    return XtGeometryAlmost;
  2261.     X#undef Set
  2262.     X}
  2263. SHAR_EOF
  2264. if test 16084 -ne "`wc -c < 'Label.c'`"
  2265. then
  2266.     echo shar: error transmitting "'Label.c'" '(should have been 16084 characters)'
  2267. fi
  2268. fi # end of overwriting check
  2269. #    End of shell archive
  2270. exit 0
  2271.  
  2272. dan
  2273. ----------------------------------------------------
  2274. O'Reilly && Associates   argv@sun.com / argv@ora.com
  2275. Opinions expressed reflect those of the author only.
  2276.